@faicad/faijs 0.19.0 → 0.29.3

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 (510) hide show
  1. package/LICENSE +202 -28
  2. package/dist/api/api-namespace.d.ts +5 -5
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +4 -4
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/assert.d.ts +2 -2
  7. package/dist/api/assert.js +8 -8
  8. package/dist/api/assert.js.map +1 -1
  9. package/dist/api/asset.d.ts +1 -1
  10. package/dist/api/asset.js +2 -2
  11. package/dist/api/asset.js.map +1 -1
  12. package/dist/api/boolean.d.ts +1 -1
  13. package/dist/api/boolean.d.ts.map +1 -1
  14. package/dist/api/boolean.js +128 -16
  15. package/dist/api/boolean.js.map +1 -1
  16. package/dist/api/brep-mirror/joinery-brep.d.ts.map +1 -1
  17. package/dist/api/brep-mirror/joinery-brep.js +3 -1
  18. package/dist/api/brep-mirror/joinery-brep.js.map +1 -1
  19. package/dist/api/cadquery-selectors/borrow-bridge.d.ts +14 -0
  20. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -0
  21. package/dist/api/cadquery-selectors/borrow-bridge.js +52 -0
  22. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -0
  23. package/dist/api/cadquery-selectors/edge.d.ts +40 -0
  24. package/dist/api/cadquery-selectors/edge.d.ts.map +1 -0
  25. package/dist/api/cadquery-selectors/edge.js +70 -0
  26. package/dist/api/cadquery-selectors/edge.js.map +1 -0
  27. package/dist/api/cadquery-selectors/entity.d.ts +121 -0
  28. package/dist/api/cadquery-selectors/entity.d.ts.map +1 -0
  29. package/dist/api/cadquery-selectors/entity.js +167 -0
  30. package/dist/api/cadquery-selectors/entity.js.map +1 -0
  31. package/dist/api/cadquery-selectors/face.d.ts +33 -0
  32. package/dist/api/cadquery-selectors/face.d.ts.map +1 -0
  33. package/dist/api/cadquery-selectors/face.js +353 -0
  34. package/dist/api/cadquery-selectors/face.js.map +1 -0
  35. package/dist/api/cadquery-selectors/grammar.d.ts +50 -0
  36. package/dist/api/cadquery-selectors/grammar.d.ts.map +1 -0
  37. package/dist/api/cadquery-selectors/grammar.js +345 -0
  38. package/dist/api/cadquery-selectors/grammar.js.map +1 -0
  39. package/dist/api/cadquery-selectors/index.d.ts +18 -0
  40. package/dist/api/cadquery-selectors/index.d.ts.map +1 -0
  41. package/dist/api/cadquery-selectors/index.js +17 -0
  42. package/dist/api/cadquery-selectors/index.js.map +1 -0
  43. package/dist/api/cadquery-selectors/predicates.d.ts +76 -0
  44. package/dist/api/cadquery-selectors/predicates.d.ts.map +1 -0
  45. package/dist/api/cadquery-selectors/predicates.js +85 -0
  46. package/dist/api/cadquery-selectors/predicates.js.map +1 -0
  47. package/dist/api/cadquery-selectors/resolve.d.ts +41 -0
  48. package/dist/api/cadquery-selectors/resolve.d.ts.map +1 -0
  49. package/dist/api/cadquery-selectors/resolve.js +243 -0
  50. package/dist/api/cadquery-selectors/resolve.js.map +1 -0
  51. package/dist/api/cadquery-selectors/types.d.ts +96 -0
  52. package/dist/api/cadquery-selectors/types.d.ts.map +1 -0
  53. package/dist/api/cadquery-selectors/types.js +11 -0
  54. package/dist/api/cadquery-selectors/types.js.map +1 -0
  55. package/dist/api/chamfer.d.ts +13 -5
  56. package/dist/api/chamfer.d.ts.map +1 -1
  57. package/dist/api/chamfer.js +63 -7
  58. package/dist/api/chamfer.js.map +1 -1
  59. package/dist/api/compound-geom.d.ts +1 -1
  60. package/dist/api/compound-geom.js +1 -1
  61. package/dist/api/compound-geom.js.map +1 -1
  62. package/dist/api/draft.d.ts +1 -1
  63. package/dist/api/draft.js +1 -1
  64. package/dist/api/draft.js.map +1 -1
  65. package/dist/api/edge-ref.d.ts +1 -1
  66. package/dist/api/edge-ref.d.ts.map +1 -1
  67. package/dist/api/edge-ref.js +11 -3
  68. package/dist/api/edge-ref.js.map +1 -1
  69. package/dist/api/engrave.d.ts +1 -1
  70. package/dist/api/engrave.js +7 -7
  71. package/dist/api/engrave.js.map +1 -1
  72. package/dist/api/extrude.d.ts +6 -1
  73. package/dist/api/extrude.d.ts.map +1 -1
  74. package/dist/api/extrude.js +59 -5
  75. package/dist/api/extrude.js.map +1 -1
  76. package/dist/api/face-ref.d.ts +1 -1
  77. package/dist/api/face-ref.js +1 -1
  78. package/dist/api/face-ref.js.map +1 -1
  79. package/dist/api/feature-repair.d.ts +1 -1
  80. package/dist/api/feature-repair.js +1 -1
  81. package/dist/api/feature-repair.js.map +1 -1
  82. package/dist/api/fillet-variable.d.ts +1 -1
  83. package/dist/api/fillet-variable.js +1 -1
  84. package/dist/api/fillet-variable.js.map +1 -1
  85. package/dist/api/fillet.d.ts +28 -8
  86. package/dist/api/fillet.d.ts.map +1 -1
  87. package/dist/api/fillet.js +64 -9
  88. package/dist/api/fillet.js.map +1 -1
  89. package/dist/api/generated/script-face-manifest.d.ts +4 -0
  90. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  91. package/dist/api/generated/script-face-manifest.js.map +1 -1
  92. package/dist/api/geom.d.ts +1 -1
  93. package/dist/api/geom.js +1 -1
  94. package/dist/api/geom.js.map +1 -1
  95. package/dist/api/helix.d.ts +1 -1
  96. package/dist/api/helix.js +1 -1
  97. package/dist/api/helix.js.map +1 -1
  98. package/dist/api/import-brep.d.ts +20 -2
  99. package/dist/api/import-brep.d.ts.map +1 -1
  100. package/dist/api/import-brep.js +28 -3
  101. package/dist/api/import-brep.js.map +1 -1
  102. package/dist/api/import-step.d.ts +17 -2
  103. package/dist/api/import-step.d.ts.map +1 -1
  104. package/dist/api/import-step.js +23 -3
  105. package/dist/api/import-step.js.map +1 -1
  106. package/dist/api/index.d.ts +2 -1
  107. package/dist/api/index.d.ts.map +1 -1
  108. package/dist/api/index.js +5 -2
  109. package/dist/api/index.js.map +1 -1
  110. package/dist/api/internal/compat-op.js +1 -1
  111. package/dist/api/internal/compat-op.js.map +1 -1
  112. package/dist/api/internal/mesh-solid-op.d.ts +236 -0
  113. package/dist/api/internal/mesh-solid-op.d.ts.map +1 -0
  114. package/dist/api/internal/mesh-solid-op.js +352 -0
  115. package/dist/api/internal/mesh-solid-op.js.map +1 -0
  116. package/dist/api/internal/svg-asset-resolver.d.ts +1 -1
  117. package/dist/api/internal/svg-asset-resolver.js +1 -1
  118. package/dist/api/internal/svg-asset-resolver.js.map +1 -1
  119. package/dist/api/knurl.d.ts +1 -1
  120. package/dist/api/knurl.d.ts.map +1 -1
  121. package/dist/api/knurl.js +3 -2
  122. package/dist/api/knurl.js.map +1 -1
  123. package/dist/api/loft.d.ts +1 -1
  124. package/dist/api/loft.js +1 -1
  125. package/dist/api/loft.js.map +1 -1
  126. package/dist/api/measurement/index.d.ts +9 -5
  127. package/dist/api/measurement/index.d.ts.map +1 -1
  128. package/dist/api/measurement/index.js +47 -20
  129. package/dist/api/measurement/index.js.map +1 -1
  130. package/dist/api/pattern.d.ts +5 -3
  131. package/dist/api/pattern.d.ts.map +1 -1
  132. package/dist/api/pattern.js +32 -4
  133. package/dist/api/pattern.js.map +1 -1
  134. package/dist/api/place.d.ts +1 -1
  135. package/dist/api/place.js +1 -1
  136. package/dist/api/place.js.map +1 -1
  137. package/dist/api/primitives.d.ts +5 -4
  138. package/dist/api/primitives.d.ts.map +1 -1
  139. package/dist/api/primitives.js +11 -5
  140. package/dist/api/primitives.js.map +1 -1
  141. package/dist/api/profile.d.ts +64 -8
  142. package/dist/api/profile.d.ts.map +1 -1
  143. package/dist/api/profile.js +61 -10
  144. package/dist/api/profile.js.map +1 -1
  145. package/dist/api/punch-hole.d.ts +3 -0
  146. package/dist/api/punch-hole.d.ts.map +1 -1
  147. package/dist/api/punch-hole.js.map +1 -1
  148. package/dist/api/reconcile.d.ts +1 -1
  149. package/dist/api/reconcile.js +1 -1
  150. package/dist/api/reconcile.js.map +1 -1
  151. package/dist/api/replicate.d.ts.map +1 -1
  152. package/dist/api/replicate.js +122 -1
  153. package/dist/api/replicate.js.map +1 -1
  154. package/dist/api/screw.d.ts +1 -1
  155. package/dist/api/screw.js +3 -3
  156. package/dist/api/screw.js.map +1 -1
  157. package/dist/api/sdf.d.ts +1 -1
  158. package/dist/api/sdf.js +2 -2
  159. package/dist/api/sdf.js.map +1 -1
  160. package/dist/api/section-by-plane.d.ts +1 -1
  161. package/dist/api/section-by-plane.d.ts.map +1 -1
  162. package/dist/api/section-by-plane.js +2 -1
  163. package/dist/api/section-by-plane.js.map +1 -1
  164. package/dist/api/shell.d.ts +11 -4
  165. package/dist/api/shell.d.ts.map +1 -1
  166. package/dist/api/shell.js +53 -7
  167. package/dist/api/shell.js.map +1 -1
  168. package/dist/api/sketch-on-face.d.ts +41 -0
  169. package/dist/api/sketch-on-face.d.ts.map +1 -1
  170. package/dist/api/sketch-on-face.js +100 -1
  171. package/dist/api/sketch-on-face.js.map +1 -1
  172. package/dist/api/sketch-on-plane.d.ts +17 -9
  173. package/dist/api/sketch-on-plane.d.ts.map +1 -1
  174. package/dist/api/sketch-on-plane.js +12 -10
  175. package/dist/api/sketch-on-plane.js.map +1 -1
  176. package/dist/api/split-by-plane.d.ts +1 -1
  177. package/dist/api/split-by-plane.d.ts.map +1 -1
  178. package/dist/api/split-by-plane.js +2 -1
  179. package/dist/api/split-by-plane.js.map +1 -1
  180. package/dist/api/split.d.ts +1 -1
  181. package/dist/api/split.js +2 -2
  182. package/dist/api/split.js.map +1 -1
  183. package/dist/api/surface/arg-spec.d.ts +8 -0
  184. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  185. package/dist/api/surface/arg-spec.js.map +1 -1
  186. package/dist/api/sweep.d.ts +1 -1
  187. package/dist/api/sweep.js +1 -1
  188. package/dist/api/sweep.js.map +1 -1
  189. package/dist/api/thicken.d.ts +1 -1
  190. package/dist/api/thicken.js +1 -1
  191. package/dist/api/thicken.js.map +1 -1
  192. package/dist/api/topo-resolve.d.ts +74 -1
  193. package/dist/api/topo-resolve.d.ts.map +1 -1
  194. package/dist/api/topo-resolve.js +180 -2
  195. package/dist/api/topo-resolve.js.map +1 -1
  196. package/dist/api/transform.d.ts +10 -6
  197. package/dist/api/transform.d.ts.map +1 -1
  198. package/dist/api/transform.js +74 -21
  199. package/dist/api/transform.js.map +1 -1
  200. package/dist/api/wire.d.ts +1 -1
  201. package/dist/api/wire.js +1 -1
  202. package/dist/api/wire.js.map +1 -1
  203. package/dist/api/xml-dom.d.ts +27 -0
  204. package/dist/api/xml-dom.d.ts.map +1 -0
  205. package/dist/api/xml-dom.js +45 -0
  206. package/dist/api/xml-dom.js.map +1 -0
  207. package/dist/brep/brep-ops.d.ts +13 -11
  208. package/dist/brep/brep-ops.d.ts.map +1 -1
  209. package/dist/brep/brep-ops.js +31 -30
  210. package/dist/brep/brep-ops.js.map +1 -1
  211. package/dist/brep/brep-topology.d.ts +5 -4
  212. package/dist/brep/brep-topology.d.ts.map +1 -1
  213. package/dist/brep/brep-topology.js +9 -6
  214. package/dist/brep/brep-topology.js.map +1 -1
  215. package/dist/brep/effective-deflection.d.ts +35 -0
  216. package/dist/brep/effective-deflection.d.ts.map +1 -0
  217. package/dist/brep/effective-deflection.js +49 -0
  218. package/dist/brep/effective-deflection.js.map +1 -0
  219. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  220. package/dist/brep/engine/adapters/brep-mock.js +27 -0
  221. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  222. package/dist/brep/engine/adapters/brepkit.d.ts +18 -0
  223. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  224. package/dist/brep/engine/adapters/brepkit.js +46 -1
  225. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  226. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  227. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  228. package/dist/brep/engine/adapters/occt.js +3 -1
  229. package/dist/brep/engine/adapters/occt.js.map +1 -1
  230. package/dist/brep/engine/primitives.d.ts +29 -7
  231. package/dist/brep/engine/primitives.d.ts.map +1 -1
  232. package/dist/brep/engine/primitives.js.map +1 -1
  233. package/dist/brep/engine/registry.d.ts +24 -1
  234. package/dist/brep/engine/registry.d.ts.map +1 -1
  235. package/dist/brep/engine/registry.js +24 -0
  236. package/dist/brep/engine/registry.js.map +1 -1
  237. package/dist/brep/engine/types.d.ts +54 -3
  238. package/dist/brep/engine/types.d.ts.map +1 -1
  239. package/dist/brep/engine/types.js +10 -0
  240. package/dist/brep/engine/types.js.map +1 -1
  241. package/dist/brep/export/export-model.d.ts +79 -0
  242. package/dist/brep/export/export-model.d.ts.map +1 -0
  243. package/dist/brep/export/export-model.js +336 -0
  244. package/dist/brep/export/export-model.js.map +1 -0
  245. package/dist/brep/face-evolution.d.ts +1 -1
  246. package/dist/brep/face-evolution.d.ts.map +1 -1
  247. package/dist/brep/face-evolution.js +20 -1
  248. package/dist/brep/face-evolution.js.map +1 -1
  249. package/dist/brep/handle-bridge.d.ts +1 -1
  250. package/dist/brep/handle-bridge.js +1 -1
  251. package/dist/brep/handle-bridge.js.map +1 -1
  252. package/dist/brep/mesh-solid.d.ts +218 -0
  253. package/dist/brep/mesh-solid.d.ts.map +1 -0
  254. package/dist/brep/mesh-solid.js +229 -0
  255. package/dist/brep/mesh-solid.js.map +1 -0
  256. package/dist/brep/primitives-brep.d.ts.map +1 -1
  257. package/dist/brep/primitives-brep.js +3 -1
  258. package/dist/brep/primitives-brep.js.map +1 -1
  259. package/dist/brep/text/fontRegistry.d.ts +32 -1
  260. package/dist/brep/text/fontRegistry.d.ts.map +1 -1
  261. package/dist/brep/text/fontRegistry.js +51 -1
  262. package/dist/brep/text/fontRegistry.js.map +1 -1
  263. package/dist/brep/text/text-to-solid.d.ts.map +1 -1
  264. package/dist/brep/text/text-to-solid.js +8 -3
  265. package/dist/brep/text/text-to-solid.js.map +1 -1
  266. package/dist/brepkit-kernel/brepkitKernel.d.ts +18 -2
  267. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  268. package/dist/brepkit-kernel/brepkitKernel.js +453 -125
  269. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  270. package/dist/brepkit-kernel/brepkitWasm.d.ts +8 -0
  271. package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
  272. package/dist/brepkit-kernel/brepkitWasm.js +10 -0
  273. package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
  274. package/dist/browser-host/browser-font-provider.d.ts +12 -0
  275. package/dist/browser-host/browser-font-provider.d.ts.map +1 -1
  276. package/dist/browser-host/browser-font-provider.js +25 -0
  277. package/dist/browser-host/browser-font-provider.js.map +1 -1
  278. package/dist/browser.d.ts +6 -3
  279. package/dist/browser.d.ts.map +1 -1
  280. package/dist/browser.js +10 -3
  281. package/dist/browser.js.map +1 -1
  282. package/dist/cad-runtime/backend-dispatch.d.ts +28 -3
  283. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  284. package/dist/cad-runtime/backend-dispatch.js +119 -4
  285. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  286. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  287. package/dist/cad-runtime/direct-executor.d.ts +19 -3
  288. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  289. package/dist/cad-runtime/direct-executor.js +49 -1
  290. package/dist/cad-runtime/direct-executor.js.map +1 -1
  291. package/dist/cad-runtime/ports.d.ts +3 -3
  292. package/dist/cad-runtime/ports.d.ts.map +1 -1
  293. package/dist/cad-runtime/ports.js.map +1 -1
  294. package/dist/cad-runtime/preview-exec.d.ts +4 -4
  295. package/dist/cad-runtime/preview-exec.js +2 -2
  296. package/dist/cad-runtime/preview-exec.js.map +1 -1
  297. package/dist/cad-runtime/runtime.d.ts +66 -8
  298. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  299. package/dist/cad-runtime/runtime.js +121 -8
  300. package/dist/cad-runtime/runtime.js.map +1 -1
  301. package/dist/define-op.d.ts +37 -1
  302. package/dist/define-op.d.ts.map +1 -1
  303. package/dist/define-op.js +25 -1
  304. package/dist/define-op.js.map +1 -1
  305. package/dist/env-agnostic.d.ts +7 -7
  306. package/dist/env-agnostic.d.ts.map +1 -1
  307. package/dist/env-agnostic.js +3 -3
  308. package/dist/env-agnostic.js.map +1 -1
  309. package/dist/geometry2d/adapt.d.ts +39 -4
  310. package/dist/geometry2d/adapt.d.ts.map +1 -1
  311. package/dist/geometry2d/adapt.js +14 -3
  312. package/dist/geometry2d/adapt.js.map +1 -1
  313. package/dist/geometry2d/blueprint.d.ts +2 -2
  314. package/dist/geometry2d/blueprint.js +2 -2
  315. package/dist/geometry2d/blueprint.js.map +1 -1
  316. package/dist/geometry2d/bridge/lift-on-plane.d.ts +18 -8
  317. package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -1
  318. package/dist/geometry2d/bridge/lift-on-plane.js +71 -12
  319. package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -1
  320. package/dist/geometry2d/bridge/plane.d.ts +17 -0
  321. package/dist/geometry2d/bridge/plane.d.ts.map +1 -1
  322. package/dist/geometry2d/bridge/plane.js +22 -0
  323. package/dist/geometry2d/bridge/plane.js.map +1 -1
  324. package/dist/geometry2d/curve2d.d.ts +25 -0
  325. package/dist/geometry2d/curve2d.d.ts.map +1 -1
  326. package/dist/geometry2d/curve2d.js +41 -5
  327. package/dist/geometry2d/curve2d.js.map +1 -1
  328. package/dist/geometry2d/pen-sketcher.d.ts +25 -0
  329. package/dist/geometry2d/pen-sketcher.d.ts.map +1 -1
  330. package/dist/geometry2d/pen-sketcher.js +43 -0
  331. package/dist/geometry2d/pen-sketcher.js.map +1 -1
  332. package/dist/index.d.ts +6 -2
  333. package/dist/index.d.ts.map +1 -1
  334. package/dist/index.js +10 -3
  335. package/dist/index.js.map +1 -1
  336. package/dist/io/bytes-node.d.ts +11 -0
  337. package/dist/io/bytes-node.d.ts.map +1 -0
  338. package/dist/io/bytes-node.js +28 -0
  339. package/dist/io/bytes-node.js.map +1 -0
  340. package/dist/io/bytes.d.ts +33 -0
  341. package/dist/io/bytes.d.ts.map +1 -0
  342. package/dist/io/bytes.js +41 -0
  343. package/dist/io/bytes.js.map +1 -0
  344. package/dist/io/fai-zip/container-read.d.ts +102 -0
  345. package/dist/io/fai-zip/container-read.d.ts.map +1 -0
  346. package/dist/io/fai-zip/container-read.js +305 -0
  347. package/dist/io/fai-zip/container-read.js.map +1 -0
  348. package/dist/io/fai-zip/container-write.d.ts +70 -0
  349. package/dist/io/fai-zip/container-write.d.ts.map +1 -0
  350. package/dist/io/fai-zip/container-write.js +186 -0
  351. package/dist/io/fai-zip/container-write.js.map +1 -0
  352. package/dist/io/fai-zip/container.d.ts +107 -0
  353. package/dist/io/fai-zip/container.d.ts.map +1 -0
  354. package/dist/io/fai-zip/container.js +89 -0
  355. package/dist/io/fai-zip/container.js.map +1 -0
  356. package/dist/io/fai-zip/index.d.ts +18 -0
  357. package/dist/io/fai-zip/index.d.ts.map +1 -0
  358. package/dist/io/fai-zip/index.js +4 -0
  359. package/dist/io/fai-zip/index.js.map +1 -0
  360. package/dist/io/index.d.ts +10 -0
  361. package/dist/io/index.d.ts.map +1 -0
  362. package/dist/io/index.js +13 -0
  363. package/dist/io/index.js.map +1 -0
  364. package/dist/io/zip.d.ts +68 -0
  365. package/dist/io/zip.d.ts.map +1 -0
  366. package/dist/io/zip.js +147 -0
  367. package/dist/io/zip.js.map +1 -0
  368. package/dist/lang/code-to-args.d.ts +30 -4
  369. package/dist/lang/code-to-args.d.ts.map +1 -1
  370. package/dist/lang/code-to-args.js +42 -3
  371. package/dist/lang/code-to-args.js.map +1 -1
  372. package/dist/lang/codegen.d.ts +45 -1
  373. package/dist/lang/codegen.d.ts.map +1 -1
  374. package/dist/lang/codegen.js +135 -6
  375. package/dist/lang/codegen.js.map +1 -1
  376. package/dist/lang/host-arg.d.ts +6 -0
  377. package/dist/lang/host-arg.d.ts.map +1 -1
  378. package/dist/lang/host-arg.js.map +1 -1
  379. package/dist/lang/metadata-extractor.d.ts +25 -0
  380. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  381. package/dist/lang/metadata-extractor.js +289 -25
  382. package/dist/lang/metadata-extractor.js.map +1 -1
  383. package/dist/lang/parse-error.d.ts +7 -1
  384. package/dist/lang/parse-error.d.ts.map +1 -1
  385. package/dist/lang/parse-error.js.map +1 -1
  386. package/dist/lang/security-scanner.d.ts +9 -1
  387. package/dist/lang/security-scanner.d.ts.map +1 -1
  388. package/dist/lang/security-scanner.js +38 -1
  389. package/dist/lang/security-scanner.js.map +1 -1
  390. package/dist/lang/statement-summary.d.ts +1 -1
  391. package/dist/lang/statement-summary.js +1 -1
  392. package/dist/lang/statement-summary.js.map +1 -1
  393. package/dist/lang/types.d.ts +1 -1
  394. package/dist/lang/types.js +1 -1
  395. package/dist/lang/types.js.map +1 -1
  396. package/dist/mesh/index.d.ts +2 -1
  397. package/dist/mesh/index.d.ts.map +1 -1
  398. package/dist/mesh/index.js +2 -1
  399. package/dist/mesh/index.js.map +1 -1
  400. package/dist/mesh/io.d.ts +69 -9
  401. package/dist/mesh/io.d.ts.map +1 -1
  402. package/dist/mesh/io.js +121 -17
  403. package/dist/mesh/io.js.map +1 -1
  404. package/dist/mesh/reconcile.d.ts +1 -1
  405. package/dist/mesh/reconcile.js +1 -1
  406. package/dist/mesh/reconcile.js.map +1 -1
  407. package/dist/mesh/rigid-transform.d.ts +3 -3
  408. package/dist/mesh/rigid-transform.js +3 -3
  409. package/dist/mesh/rigid-transform.js.map +1 -1
  410. package/dist/mesh/stl-unit.d.ts +24 -0
  411. package/dist/mesh/stl-unit.d.ts.map +1 -0
  412. package/dist/mesh/stl-unit.js +17 -0
  413. package/dist/mesh/stl-unit.js.map +1 -0
  414. package/dist/mesh/threemf-bambu.d.ts +142 -0
  415. package/dist/mesh/threemf-bambu.d.ts.map +1 -0
  416. package/dist/mesh/threemf-bambu.js +334 -0
  417. package/dist/mesh/threemf-bambu.js.map +1 -0
  418. package/dist/mesh/threemf-loader.d.ts +50 -0
  419. package/dist/mesh/threemf-loader.d.ts.map +1 -0
  420. package/dist/mesh/threemf-loader.js +628 -0
  421. package/dist/mesh/threemf-loader.js.map +1 -0
  422. package/dist/mesh/threemf-view.d.ts +71 -0
  423. package/dist/mesh/threemf-view.d.ts.map +1 -0
  424. package/dist/mesh/threemf-view.js +100 -0
  425. package/dist/mesh/threemf-view.js.map +1 -0
  426. package/dist/mesh/transform.d.ts +2 -2
  427. package/dist/mesh/transform.d.ts.map +1 -1
  428. package/dist/mesh/transform.js +3 -3
  429. package/dist/mesh/transform.js.map +1 -1
  430. package/dist/mesh/types.d.ts +1 -1
  431. package/dist/mesh/types.d.ts.map +1 -1
  432. package/dist/mesh/types.js.map +1 -1
  433. package/dist/node-host/cli.d.ts +44 -6
  434. package/dist/node-host/cli.d.ts.map +1 -1
  435. package/dist/node-host/cli.js +127 -50
  436. package/dist/node-host/cli.js.map +1 -1
  437. package/dist/node-host/font-family-index.d.ts +93 -0
  438. package/dist/node-host/font-family-index.d.ts.map +1 -0
  439. package/dist/node-host/font-family-index.js +273 -0
  440. package/dist/node-host/font-family-index.js.map +1 -0
  441. package/dist/node-host/fs-asset-resolver.d.ts +8 -3
  442. package/dist/node-host/fs-asset-resolver.d.ts.map +1 -1
  443. package/dist/node-host/fs-asset-resolver.js +13 -5
  444. package/dist/node-host/fs-asset-resolver.js.map +1 -1
  445. package/dist/node-host/index.d.ts +8 -0
  446. package/dist/node-host/index.d.ts.map +1 -1
  447. package/dist/node-host/index.js +1 -0
  448. package/dist/node-host/index.js.map +1 -1
  449. package/dist/node-host/node-font-provider.d.ts +28 -0
  450. package/dist/node-host/node-font-provider.d.ts.map +1 -1
  451. package/dist/node-host/node-font-provider.js +49 -0
  452. package/dist/node-host/node-font-provider.js.map +1 -1
  453. package/dist/node.d.ts +1 -0
  454. package/dist/node.d.ts.map +1 -1
  455. package/dist/node.js +1 -0
  456. package/dist/node.js.map +1 -1
  457. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  458. package/dist/occt-kernel/occt-primitives.js +35 -2
  459. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  460. package/dist/occt-kernel/occtKernel.d.ts +18 -13
  461. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  462. package/dist/occt-kernel/occtKernel.js +20 -31
  463. package/dist/occt-kernel/occtKernel.js.map +1 -1
  464. package/dist/occt-kernel/stepColorParser.d.ts +18 -0
  465. package/dist/occt-kernel/stepColorParser.d.ts.map +1 -1
  466. package/dist/occt-kernel/stepColorParser.js +38 -0
  467. package/dist/occt-kernel/stepColorParser.js.map +1 -1
  468. package/dist/occt-kernel/topologyExt.d.ts +1 -1
  469. package/dist/occt-kernel/topologyExt.d.ts.map +1 -1
  470. package/dist/occt-kernel/topologyExt.js +8 -6
  471. package/dist/occt-kernel/topologyExt.js.map +1 -1
  472. package/dist/primitives/text/cjk-font.d.ts +2 -15
  473. package/dist/primitives/text/cjk-font.d.ts.map +1 -1
  474. package/dist/primitives/text/cjk-font.js +13 -1
  475. package/dist/primitives/text/cjk-font.js.map +1 -1
  476. package/dist/runtime-state.d.ts +103 -9
  477. package/dist/runtime-state.d.ts.map +1 -1
  478. package/dist/runtime-state.js +95 -2
  479. package/dist/runtime-state.js.map +1 -1
  480. package/dist/sdk.d.ts +4 -4
  481. package/dist/sdk.d.ts.map +1 -1
  482. package/dist/sdk.js +6 -6
  483. package/dist/sdk.js.map +1 -1
  484. package/dist/shape.d.ts +97 -2
  485. package/dist/shape.d.ts.map +1 -1
  486. package/dist/shape.js +126 -1
  487. package/dist/shape.js.map +1 -1
  488. package/dist/tolerance.d.ts +38 -0
  489. package/dist/tolerance.d.ts.map +1 -0
  490. package/dist/tolerance.js +40 -0
  491. package/dist/tolerance.js.map +1 -0
  492. package/dist/topology/naming/lineage.d.ts +6 -0
  493. package/dist/topology/naming/lineage.d.ts.map +1 -1
  494. package/dist/topology/naming/lineage.js +8 -0
  495. package/dist/topology/naming/lineage.js.map +1 -1
  496. package/dist/topology/naming/resolve-edge.d.ts +20 -1
  497. package/dist/topology/naming/resolve-edge.d.ts.map +1 -1
  498. package/dist/topology/naming/resolve-edge.js +54 -20
  499. package/dist/topology/naming/resolve-edge.js.map +1 -1
  500. package/dist/topology/naming/score.js +3 -3
  501. package/dist/topology/naming/score.js.map +1 -1
  502. package/dist/units.d.ts +248 -0
  503. package/dist/units.d.ts.map +1 -0
  504. package/dist/units.js +397 -0
  505. package/dist/units.js.map +1 -0
  506. package/dist/weapp.d.ts +6 -2
  507. package/dist/weapp.d.ts.map +1 -1
  508. package/dist/weapp.js +7 -1
  509. package/dist/weapp.js.map +1 -1
  510. package/package.json +28 -3
@@ -1,5 +1,5 @@
1
1
  /**
2
- * stdlib fillet — fillet 圆角库函数(BREP-only,directEdit 能力)
2
+ * api fillet — fillet 圆角库函数(BREP-only,directEdit 能力)
3
3
  *
4
4
  * 平台分层(narrowing plan Phase 5,D11):**中立 op**——`filletWithHistory` 是
5
5
  * L1 核心面(brepkit 亦实现),实现全程走 L1(getBrepApi,D12),不声明 engines;
@@ -20,28 +20,48 @@
20
20
  * - 几何限定符字符串选边(§4)
21
21
  */
22
22
  import type { Shape } from '../mesh/types.js';
23
+ /** 边选择器校验选项。 */
24
+ export interface EdgeSelectorCheckOptions {
25
+ /**
26
+ * 允许 1 起序号作为边选择器(**仅网格链**;见 `resolveMeshEdges`)。
27
+ *
28
+ * 精度链不开这个口子:BREP 的边身份是 role 线路(两个相邻面的 `(origin, role)`),
29
+ * 序号只是内核枚举序,跨特征会漂移——让精度链接受序号等于把"可重放的引用"降级成
30
+ * "这次跑出来的下标"。近似链相反:没有 role 层,序号是唯一无歧义的指认方式。
31
+ */
32
+ readonly allowOrdinals?: boolean;
33
+ }
23
34
  /**
24
- * Validate fillet parameters: `edges` must be a non-empty array of EdgeTopoRef,
25
- * each with kind key "edge" and a two-entry faces pair; `radius` must be a
35
+ * Validate fillet parameters: `edges` must be a non-empty array of EdgeTopoRef
36
+ * (each with kind key "edge" and a two-entry faces pair) — or of 1-based
37
+ * ordinals when `opts.allowOrdinals` (the mesh chain); `radius` must be a
26
38
  * positive number (M1: uniform radius only).
27
39
  * @param params the raw fillet operation parameters.
40
+ * @param opts the selector-form options (mesh chain allows ordinals).
28
41
  */
29
- export declare function assertFilletParams(params: Record<string, unknown>): void;
42
+ export declare function assertFilletParams(params: Record<string, unknown>, opts?: EdgeSelectorCheckOptions): void;
30
43
  /**
31
- * 在几何体上做圆角(等半径)。仅 BREP 可用。
44
+ * 在几何体上做圆角(等半径)。
45
+ *
46
+ * 两条路径都以 `meshEngines: ['brepkit']` 之外的事实为界:BREP 输入走
47
+ * `filletWithHistory`(带面演化与 roleTable 传播);**网格实体**输入走网格后端
48
+ * (近似拓扑无 role,边按几何或序号解析,无面演化)。非 BREP 的**裸网格**输入仍抛
49
+ * `E_MESH_SOLID_UNSUPPORTED`——裸网格没有近似拓扑,没有边可选。
32
50
  * @group 特征
33
51
  * @inputs 1
34
52
  * @async true
35
53
  * @qual ok
36
54
  * @name fillet
37
- * @note 圆角是 BREP-only:非 BREP 输入抛 E_MESH_UNSUPPORTED。`radius` 为正数(mm)。
38
- * 圆角后 roleTable 经 filletWithHistory 传播,保证后续特征仍可按 role 选面/选边。
55
+ * @note `radius` 为正数(mm)。BREP 路径圆角后 roleTable 经 filletWithHistory 传播,
56
+ * 后续特征仍可按 role 选面/选边;网格实体路径没有 role 层,边只能按几何或
57
+ * 序号(近似拓扑 `edges` 数组下标 + 1)指认。
39
58
  * @returns Shape 圆角后的几何。
40
59
  * @param input - 目标几何。type:Shape required:true
41
- * @param params.edges - 参与圆角的边(EdgeTopoRef[],条目为相邻两面的 role 线路)。type:EdgeTopoRef[] required:true
60
+ * @param params.edges - 参与圆角的边:相邻两面的 role 线路(EdgeTopoRef[]);网格链上也可用 1 起序号。type:EdgeTopoRef[] required:true
42
61
  * @param params.radius - 圆角半径(mm,>0)。type:number required:true
43
62
  * @example
44
63
  * const p = await cad.fillet(part0, { edges: [{ kind:'edge', faces:[{ origin:'box', role:'box:top' }, { origin:'box', role:'box:front' }], hint:{ kind:'edge' } }], radius:2 })
64
+ * const q = await cad.fillet(meshPart, { edges: [3], radius: 1 })
45
65
  */
46
66
  export declare const fillet: ((input: Shape, params: Record<string, unknown>) => Promise<Shape>) & {
47
67
  __faijs__dualOp?: import("../define-op.js").DualOpMeta;
@@ -1 +1 @@
1
- {"version":3,"file":"fillet.d.ts","sourceRoot":"","sources":["../../src/api/fillet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAe1C;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAkBxE;AAoED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,MAAM;;CAOjB,CAAA"}
1
+ {"version":3,"file":"fillet.d.ts","sourceRoot":"","sources":["../../src/api/fillet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAgB1C,gBAAgB;AAChB,MAAM,WAAW,wBAAwB;IACvC;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CACjC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,CAAC,EAAE,wBAAwB,GAC9B,IAAI,CAwBN;AA6GD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,MAAM;;CAYjB,CAAA"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * stdlib fillet — fillet 圆角库函数(BREP-only,directEdit 能力)
2
+ * api fillet — fillet 圆角库函数(BREP-only,directEdit 能力)
3
3
  *
4
4
  * 平台分层(narrowing plan Phase 5,D11):**中立 op**——`filletWithHistory` 是
5
5
  * L1 核心面(brepkit 亦实现),实现全程走 L1(getBrepApi,D12),不声明 engines;
@@ -27,19 +27,27 @@ import { fromBrep, brepOf, inputRoleTable } from '../shape.js';
27
27
  import { defineOp } from '../sdk.js';
28
28
  import { resolveTopoRef, TopoRefError } from '../topology/naming/index.js';
29
29
  import { buildEdgeResolutionContext } from './topo-resolve.js';
30
- // ── 参数自校验(stdlib 被直接 import 时的防御层)──
30
+ import { meshKernelFailure, meshSolidEntry, meshSolidProduct, resolveMeshEdges } from './internal/mesh-solid-op.js';
31
31
  /**
32
- * Validate fillet parameters: `edges` must be a non-empty array of EdgeTopoRef,
33
- * each with kind key "edge" and a two-entry faces pair; `radius` must be a
32
+ * Validate fillet parameters: `edges` must be a non-empty array of EdgeTopoRef
33
+ * (each with kind key "edge" and a two-entry faces pair) — or of 1-based
34
+ * ordinals when `opts.allowOrdinals` (the mesh chain); `radius` must be a
34
35
  * positive number (M1: uniform radius only).
35
36
  * @param params the raw fillet operation parameters.
37
+ * @param opts the selector-form options (mesh chain allows ordinals).
36
38
  */
37
- export function assertFilletParams(params) {
39
+ export function assertFilletParams(params, opts) {
38
40
  const edges = params.edges;
39
41
  if (!Array.isArray(edges) || edges.length === 0) {
40
42
  throw new Error('E_FILLET_NO_EDGES: fillet requires at least one edge');
41
43
  }
42
44
  for (const e of edges) {
45
+ if (opts?.allowOrdinals && typeof e === 'number') {
46
+ if (!Number.isInteger(e) || e < 1) {
47
+ throw new Error('E_FILLET_BAD_EDGE_REF: an edge ordinal must be a positive integer (1-based)');
48
+ }
49
+ continue;
50
+ }
43
51
  if (!e || typeof e !== 'object' || e.kind !== 'edge') {
44
52
  throw new Error('E_FILLET_BAD_EDGE_REF: every edge entry must be an EdgeTopoRef with kind:"edge"');
45
53
  }
@@ -105,23 +113,70 @@ function filletBrep(input, params) {
105
113
  return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, faceEvolution, roleTable });
106
114
  }
107
115
  /**
108
- * 在几何体上做圆角(等半径)。仅 BREP 可用。
116
+ * 网格实体路径:对近似拓扑里识别出的边倒圆角(方案 2026-10-01 §3.5 三明治)。
117
+ *
118
+ * 与 BREP 路径的三处实质差异,都是"网格零件没有精度链、没有 role 层"的直接后果:
119
+ * - 边**按几何或序号**解析:`EdgeTopoRef` 走长度/中点匹配;**1 起序号**直接取自近似
120
+ * 拓扑的 `edges` 数组下标 + 1(等长边靠几何分不开,序号是唯一无歧义的指认方式);
121
+ * - 内核调用走 L1 裸 `kernel.fillet`(`filletWithHistory` 是精度链的面演化能力,
122
+ * 近似拓扑没有 hash 演化可言,故**不产生** faceEvolution / roleTable,如实缺席
123
+ * 而不是造一张恒等映射);
124
+ * - 产物句柄写回后由 `meshSolidProduct` 重新三角化并重建近似拓扑。
125
+ *
126
+ * GOTCHA(2026-10-01 实测,见 `brepkit-kernel/mesh-solid-topology.test.ts`):
127
+ * 一次请求里的**全部**边交给内核,会在共面边链(如圆柱端盖的 64 条边)上被整体
128
+ * 拒绝——不是单条边不可倒,而是"一次性磨圆会自交"。故本实现**如实失败**,不自动
129
+ * 拆成逐边重试(运行时换策略会掩盖几何事实)。要给共面边链倒角,请分多次调用,
130
+ * 每次一组几何上互不相邻的边。
131
+ *
132
+ * @param input - the mesh-solid input.
133
+ * @param params - the validated fillet parameters.
134
+ * @returns the filleted mesh solid as a new mesh part.
135
+ */
136
+ function filletMeshSolid(input, params) {
137
+ const edges = params.edges;
138
+ const radius = params.radius;
139
+ const entry = meshSolidEntry(input, 'fillet');
140
+ const edgeHandles = resolveMeshEdges(entry, edges, 'fillet');
141
+ let result;
142
+ try {
143
+ result = entry.kernel.fillet(entry.solid, edgeHandles, radius);
144
+ }
145
+ catch (cause) {
146
+ throw meshKernelFailure('fillet', 'E_FILLET_RADIUS_TOO_LARGE', `fillet(r=${radius}) on ${edgeHandles.length} edge(s)`, cause);
147
+ }
148
+ return meshSolidProduct(entry, result);
149
+ }
150
+ /**
151
+ * 在几何体上做圆角(等半径)。
152
+ *
153
+ * 两条路径都以 `meshEngines: ['brepkit']` 之外的事实为界:BREP 输入走
154
+ * `filletWithHistory`(带面演化与 roleTable 传播);**网格实体**输入走网格后端
155
+ * (近似拓扑无 role,边按几何或序号解析,无面演化)。非 BREP 的**裸网格**输入仍抛
156
+ * `E_MESH_SOLID_UNSUPPORTED`——裸网格没有近似拓扑,没有边可选。
109
157
  * @group 特征
110
158
  * @inputs 1
111
159
  * @async true
112
160
  * @qual ok
113
161
  * @name fillet
114
- * @note 圆角是 BREP-only:非 BREP 输入抛 E_MESH_UNSUPPORTED。`radius` 为正数(mm)。
115
- * 圆角后 roleTable 经 filletWithHistory 传播,保证后续特征仍可按 role 选面/选边。
162
+ * @note `radius` 为正数(mm)。BREP 路径圆角后 roleTable 经 filletWithHistory 传播,
163
+ * 后续特征仍可按 role 选面/选边;网格实体路径没有 role 层,边只能按几何或
164
+ * 序号(近似拓扑 `edges` 数组下标 + 1)指认。
116
165
  * @returns Shape 圆角后的几何。
117
166
  * @param input - 目标几何。type:Shape required:true
118
- * @param params.edges - 参与圆角的边(EdgeTopoRef[],条目为相邻两面的 role 线路)。type:EdgeTopoRef[] required:true
167
+ * @param params.edges - 参与圆角的边:相邻两面的 role 线路(EdgeTopoRef[]);网格链上也可用 1 起序号。type:EdgeTopoRef[] required:true
119
168
  * @param params.radius - 圆角半径(mm,>0)。type:number required:true
120
169
  * @example
121
170
  * const p = await cad.fillet(part0, { edges: [{ kind:'edge', faces:[{ origin:'box', role:'box:top' }, { origin:'box', role:'box:front' }], hint:{ kind:'edge' } }], radius:2 })
171
+ * const q = await cad.fillet(meshPart, { edges: [3], radius: 1 })
122
172
  */
123
173
  export const fillet = defineOp({
124
174
  capabilities: ['directEdit'],
175
+ meshEngines: ['brepkit'],
176
+ mesh(input, params) {
177
+ assertFilletParams(params, { allowOrdinals: true });
178
+ return filletMeshSolid(input, params);
179
+ },
125
180
  brep(input, params) {
126
181
  assertFilletParams(params);
127
182
  return filletBrep(input, params);
@@ -1 +1 @@
1
- {"version":3,"file":"fillet.js","sourceRoot":"","sources":["../../src/api/fillet.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib fillet — fillet 圆角库函数(BREP-only,directEdit 能力)\n *\n * 平台分层(narrowing plan Phase 5,D11):**中立 op**——`filletWithHistory` 是\n * L1 核心面(brepkit 亦实现),实现全程走 L1(getBrepApi,D12),不声明 engines;\n * capabilities 保留族级 `directEdit`(brepkit 声明 directEdit: true)。\n *\n * 与 chamfer 的差异:fillet 用 filletWithHistory 走面演化 + roleTable 传播\n * (chamfer 在 P5 同步改造)。M1 只支持等半径;M2 计划支持变半径与几何限定符。\n *\n * 设计见 docs/plans/2026-09-10-fillet-op-and-editor-ui.md §2–§3。\n *\n * M1:\n * - 等半径(number):kernel.filletWithHistory(solid, edges, radius, hashes, bound)\n * - 走 filletWithRoleTable 传播 roleTable(§3.2)\n * - BREP-only:mesh 输入 → E_MESH_UNSUPPORTED(backend-dispatch 静态判定)\n *\n * M2(未实施):\n * - 变半径 [r1, r2]:filletVariable + 单边 + 不产 roleTable(§3.3 降级)\n * - 几何限定符字符串选边(§4)\n */\n\nimport type { Shape } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { filletWithRoleTable } from '../brep/face-evolution'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { getCurrentStmt } from '../runtime-state'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { EdgeTopoRef, ResolutionContext } from '../topology/naming'\nimport { resolveTopoRef, TopoRefError } from '../topology/naming'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { buildEdgeResolutionContext } from './topo-resolve'\n\n// ── 参数自校验(stdlib 被直接 import 时的防御层)──\n\n/**\n * Validate fillet parameters: `edges` must be a non-empty array of EdgeTopoRef,\n * each with kind key \"edge\" and a two-entry faces pair; `radius` must be a\n * positive number (M1: uniform radius only).\n * @param params the raw fillet operation parameters.\n */\nexport function assertFilletParams(params: Record<string, unknown>): void {\n const edges = params.edges\n if (!Array.isArray(edges) || edges.length === 0) {\n throw new Error('E_FILLET_NO_EDGES: fillet requires at least one edge')\n }\n for (const e of edges) {\n if (!e || typeof e !== 'object' || (e as { kind?: unknown }).kind !== 'edge') {\n throw new Error('E_FILLET_BAD_EDGE_REF: every edge entry must be an EdgeTopoRef with kind:\"edge\"')\n }\n const faces = (e as { faces?: unknown }).faces\n if (!Array.isArray(faces) || faces.length !== 2) {\n throw new Error('E_FILLET_BAD_EDGE_REF: EdgeTopoRef.faces must be a two-entry RoleQualifier pair')\n }\n }\n const radius = params.radius\n if (typeof radius !== 'number' || !Number.isFinite(radius) || radius <= 0) {\n throw new Error('E_FILLET_BAD_RADIUS: fillet.radius must be a positive number')\n }\n}\n\n/** 解析一条 EdgeTopoRef → handle;失败抛命名层 TopoRefError。 */\nfunction resolveEdge(ctx: ResolutionContext, ref: EdgeTopoRef): BrepHandle {\n const r = resolveTopoRef(ref, ctx)\n if (r.handle === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `fillet: edge resolved without handle (${ref.faces[0].role}/${ref.faces[1].role})`)\n }\n return r.handle as BrepHandle\n}\n\n/**\n * 把内核 OcctError 回译成 E_FILLET_RADIUS_TOO_LARGE。\n *\n * OCCT 在半径超过邻面尺寸、三面交汇处、凹边处都可能失败。\n * 绝不可静默返回未圆角的原形状(§9 风险)。\n */\nfunction translateOcctError(err: unknown): Error {\n const msg = err instanceof Error ? err.message : String(err)\n if (msg.includes('E_FILLET') || msg.includes('E_TOPO')) return err as Error\n return new Error(`E_FILLET_RADIUS_TOO_LARGE: OCCT fillet failed — ${msg}`)\n}\n\n/** BREP-only 主入口(M1 等半径 flow)。 */\nfunction filletBrep(input: Shape, params: Record<string, unknown>): Shape {\n // L1 面(D12):filletWithHistory 是 L1,全链路中立。\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('E_FILLET_NO_BREP: fillet input is not BREP')\n\n const edges = params.edges as EdgeTopoRef[]\n const radius = params.radius as number\n const ctx = buildEdgeResolutionContext(kernel, input as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'fillet: input has no edge naming context')\n\n // 解析所有 EdgeTopoRef → Edge 句柄\n const edgeHandles = edges.map((e) => resolveEdge(ctx, e))\n\n // 输入 roleTable + outStmt(与 boolean.ts 同构)。Phase 1.6:origin=本次语句 StmtId。\n const inputTable = inputRoleTable(input) as ReadonlyMap<unknown, unknown> | undefined\n const outStmt = String(getCurrentStmt()?.id ?? '')\n\n let resultSolid: BrepHandle\n let faceEvolution: Map<number, number[]> | undefined\n let roleTable: ReadonlyMap<unknown, unknown> | undefined\n\n try {\n const r = filletWithRoleTable(\n kernel,\n solid,\n edgeHandles,\n radius,\n inputTable ?? new Map(),\n outStmt,\n )\n resultSolid = r.result\n faceEvolution = r.faceEvolution\n roleTable = r.roleTable\n } catch (err) {\n throw translateOcctError(err)\n }\n\n return fromBrep(\n solidToShape(kernel, resultSolid),\n { solid: resultSolid, faceEvolution, roleTable },\n )\n}\n\n/**\n * 在几何体上做圆角(等半径)。仅 BREP 可用。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name fillet\n * @note 圆角是 BREP-only:非 BREP 输入抛 E_MESH_UNSUPPORTED。`radius` 为正数(mm)。\n * 圆角后 roleTable 经 filletWithHistory 传播,保证后续特征仍可按 role 选面/选边。\n * @returns Shape 圆角后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.edges - 参与圆角的边(EdgeTopoRef[],条目为相邻两面的 role 线路)。type:EdgeTopoRef[] required:true\n * @param params.radius - 圆角半径(mm,>0)。type:number required:true\n * @example\n * const p = await cad.fillet(part0, { edges: [{ kind:'edge', faces:[{ origin:'box', role:'box:top' }, { origin:'box', role:'box:front' }], hint:{ kind:'edge' } }], radius:2 })\n */\nexport const fillet = defineOp({\n capabilities: ['directEdit'],\n brep(input: Shape, params: Record<string, unknown>) {\n assertFilletParams(params)\n return filletBrep(input, params)\n },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
1
+ {"version":3,"file":"fillet.js","sourceRoot":"","sources":["../../src/api/fillet.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api fillet — fillet 圆角库函数(BREP-only,directEdit 能力)\n *\n * 平台分层(narrowing plan Phase 5,D11):**中立 op**——`filletWithHistory` 是\n * L1 核心面(brepkit 亦实现),实现全程走 L1(getBrepApi,D12),不声明 engines;\n * capabilities 保留族级 `directEdit`(brepkit 声明 directEdit: true)。\n *\n * 与 chamfer 的差异:fillet 用 filletWithHistory 走面演化 + roleTable 传播\n * (chamfer 在 P5 同步改造)。M1 只支持等半径;M2 计划支持变半径与几何限定符。\n *\n * 设计见 docs/plans/2026-09-10-fillet-op-and-editor-ui.md §2–§3。\n *\n * M1:\n * - 等半径(number):kernel.filletWithHistory(solid, edges, radius, hashes, bound)\n * - 走 filletWithRoleTable 传播 roleTable(§3.2)\n * - BREP-only:mesh 输入 → E_MESH_UNSUPPORTED(backend-dispatch 静态判定)\n *\n * M2(未实施):\n * - 变半径 [r1, r2]:filletVariable + 单边 + 不产 roleTable(§3.3 降级)\n * - 几何限定符字符串选边(§4)\n */\n\nimport type { Shape } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { filletWithRoleTable } from '../brep/face-evolution'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { getCurrentStmt } from '../runtime-state'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { EdgeTopoRef, ResolutionContext } from '../topology/naming'\nimport { resolveTopoRef, TopoRefError } from '../topology/naming'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { buildEdgeResolutionContext } from './topo-resolve'\nimport { meshKernelFailure, meshSolidEntry, meshSolidProduct, resolveMeshEdges } from './internal/mesh-solid-op'\n\n// ── 参数自校验(api 层被直接 import 时的防御层)──\n\n/** 边选择器校验选项。 */\nexport interface EdgeSelectorCheckOptions {\n /**\n * 允许 1 起序号作为边选择器(**仅网格链**;见 `resolveMeshEdges`)。\n *\n * 精度链不开这个口子:BREP 的边身份是 role 线路(两个相邻面的 `(origin, role)`),\n * 序号只是内核枚举序,跨特征会漂移——让精度链接受序号等于把\"可重放的引用\"降级成\n * \"这次跑出来的下标\"。近似链相反:没有 role 层,序号是唯一无歧义的指认方式。\n */\n readonly allowOrdinals?: boolean\n}\n\n/**\n * Validate fillet parameters: `edges` must be a non-empty array of EdgeTopoRef\n * (each with kind key \"edge\" and a two-entry faces pair) — or of 1-based\n * ordinals when `opts.allowOrdinals` (the mesh chain); `radius` must be a\n * positive number (M1: uniform radius only).\n * @param params the raw fillet operation parameters.\n * @param opts the selector-form options (mesh chain allows ordinals).\n */\nexport function assertFilletParams(\n params: Record<string, unknown>,\n opts?: EdgeSelectorCheckOptions,\n): void {\n const edges = params.edges\n if (!Array.isArray(edges) || edges.length === 0) {\n throw new Error('E_FILLET_NO_EDGES: fillet requires at least one edge')\n }\n for (const e of edges) {\n if (opts?.allowOrdinals && typeof e === 'number') {\n if (!Number.isInteger(e) || e < 1) {\n throw new Error('E_FILLET_BAD_EDGE_REF: an edge ordinal must be a positive integer (1-based)')\n }\n continue\n }\n if (!e || typeof e !== 'object' || (e as { kind?: unknown }).kind !== 'edge') {\n throw new Error('E_FILLET_BAD_EDGE_REF: every edge entry must be an EdgeTopoRef with kind:\"edge\"')\n }\n const faces = (e as { faces?: unknown }).faces\n if (!Array.isArray(faces) || faces.length !== 2) {\n throw new Error('E_FILLET_BAD_EDGE_REF: EdgeTopoRef.faces must be a two-entry RoleQualifier pair')\n }\n }\n const radius = params.radius\n if (typeof radius !== 'number' || !Number.isFinite(radius) || radius <= 0) {\n throw new Error('E_FILLET_BAD_RADIUS: fillet.radius must be a positive number')\n }\n}\n\n/** 解析一条 EdgeTopoRef → handle;失败抛命名层 TopoRefError。 */\nfunction resolveEdge(ctx: ResolutionContext, ref: EdgeTopoRef): BrepHandle {\n const r = resolveTopoRef(ref, ctx)\n if (r.handle === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `fillet: edge resolved without handle (${ref.faces[0].role}/${ref.faces[1].role})`)\n }\n return r.handle as BrepHandle\n}\n\n/**\n * 把内核 OcctError 回译成 E_FILLET_RADIUS_TOO_LARGE。\n *\n * OCCT 在半径超过邻面尺寸、三面交汇处、凹边处都可能失败。\n * 绝不可静默返回未圆角的原形状(§9 风险)。\n */\nfunction translateOcctError(err: unknown): Error {\n const msg = err instanceof Error ? err.message : String(err)\n if (msg.includes('E_FILLET') || msg.includes('E_TOPO')) return err as Error\n return new Error(`E_FILLET_RADIUS_TOO_LARGE: OCCT fillet failed — ${msg}`)\n}\n\n/** BREP-only 主入口(M1 等半径 flow)。 */\nfunction filletBrep(input: Shape, params: Record<string, unknown>): Shape {\n // L1 面(D12):filletWithHistory 是 L1,全链路中立。\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('E_FILLET_NO_BREP: fillet input is not BREP')\n\n const edges = params.edges as EdgeTopoRef[]\n const radius = params.radius as number\n const ctx = buildEdgeResolutionContext(kernel, input as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'fillet: input has no edge naming context')\n\n // 解析所有 EdgeTopoRef → Edge 句柄\n const edgeHandles = edges.map((e) => resolveEdge(ctx, e))\n\n // 输入 roleTable + outStmt(与 boolean.ts 同构)。Phase 1.6:origin=本次语句 StmtId。\n const inputTable = inputRoleTable(input) as ReadonlyMap<unknown, unknown> | undefined\n const outStmt = String(getCurrentStmt()?.id ?? '')\n\n let resultSolid: BrepHandle\n let faceEvolution: Map<number, number[]> | undefined\n let roleTable: ReadonlyMap<unknown, unknown> | undefined\n\n try {\n const r = filletWithRoleTable(\n kernel,\n solid,\n edgeHandles,\n radius,\n inputTable ?? new Map(),\n outStmt,\n )\n resultSolid = r.result\n faceEvolution = r.faceEvolution\n roleTable = r.roleTable\n } catch (err) {\n throw translateOcctError(err)\n }\n\n return fromBrep(\n solidToShape(kernel, resultSolid),\n { solid: resultSolid, faceEvolution, roleTable },\n )\n}\n\n/**\n * 网格实体路径:对近似拓扑里识别出的边倒圆角(方案 2026-10-01 §3.5 三明治)。\n *\n * 与 BREP 路径的三处实质差异,都是\"网格零件没有精度链、没有 role 层\"的直接后果:\n * - 边**按几何或序号**解析:`EdgeTopoRef` 走长度/中点匹配;**1 起序号**直接取自近似\n * 拓扑的 `edges` 数组下标 + 1(等长边靠几何分不开,序号是唯一无歧义的指认方式);\n * - 内核调用走 L1 裸 `kernel.fillet`(`filletWithHistory` 是精度链的面演化能力,\n * 近似拓扑没有 hash 演化可言,故**不产生** faceEvolution / roleTable,如实缺席\n * 而不是造一张恒等映射);\n * - 产物句柄写回后由 `meshSolidProduct` 重新三角化并重建近似拓扑。\n *\n * GOTCHA(2026-10-01 实测,见 `brepkit-kernel/mesh-solid-topology.test.ts`):\n * 一次请求里的**全部**边交给内核,会在共面边链(如圆柱端盖的 64 条边)上被整体\n * 拒绝——不是单条边不可倒,而是\"一次性磨圆会自交\"。故本实现**如实失败**,不自动\n * 拆成逐边重试(运行时换策略会掩盖几何事实)。要给共面边链倒角,请分多次调用,\n * 每次一组几何上互不相邻的边。\n *\n * @param input - the mesh-solid input.\n * @param params - the validated fillet parameters.\n * @returns the filleted mesh solid as a new mesh part.\n */\nfunction filletMeshSolid(input: Shape, params: Record<string, unknown>): Shape {\n const edges = params.edges as (number | EdgeTopoRef)[]\n const radius = params.radius as number\n const entry = meshSolidEntry(input, 'fillet')\n const edgeHandles = resolveMeshEdges(entry, edges, 'fillet')\n\n let result: BrepHandle\n try {\n result = entry.kernel.fillet(entry.solid, edgeHandles, radius)\n } catch (cause) {\n throw meshKernelFailure(\n 'fillet',\n 'E_FILLET_RADIUS_TOO_LARGE',\n `fillet(r=${radius}) on ${edgeHandles.length} edge(s)`,\n cause,\n )\n }\n return meshSolidProduct(entry, result)\n}\n\n/**\n * 在几何体上做圆角(等半径)。\n *\n * 两条路径都以 `meshEngines: ['brepkit']` 之外的事实为界:BREP 输入走\n * `filletWithHistory`(带面演化与 roleTable 传播);**网格实体**输入走网格后端\n * (近似拓扑无 role,边按几何或序号解析,无面演化)。非 BREP 的**裸网格**输入仍抛\n * `E_MESH_SOLID_UNSUPPORTED`——裸网格没有近似拓扑,没有边可选。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name fillet\n * @note `radius` 为正数(mm)。BREP 路径圆角后 roleTable 经 filletWithHistory 传播,\n * 后续特征仍可按 role 选面/选边;网格实体路径没有 role 层,边只能按几何或\n * 序号(近似拓扑 `edges` 数组下标 + 1)指认。\n * @returns Shape 圆角后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.edges - 参与圆角的边:相邻两面的 role 线路(EdgeTopoRef[]);网格链上也可用 1 起序号。type:EdgeTopoRef[] required:true\n * @param params.radius - 圆角半径(mm,>0)。type:number required:true\n * @example\n * const p = await cad.fillet(part0, { edges: [{ kind:'edge', faces:[{ origin:'box', role:'box:top' }, { origin:'box', role:'box:front' }], hint:{ kind:'edge' } }], radius:2 })\n * const q = await cad.fillet(meshPart, { edges: [3], radius: 1 })\n */\nexport const fillet = defineOp({\n capabilities: ['directEdit'],\n meshEngines: ['brepkit'],\n mesh(input: Shape, params: Record<string, unknown>) {\n assertFilletParams(params, { allowOrdinals: true })\n return filletMeshSolid(input, params)\n },\n brep(input: Shape, params: Record<string, unknown>) {\n assertFilletParams(params)\n return filletBrep(input, params)\n },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
@@ -11,6 +11,10 @@ export interface ScriptFaceOp {
11
11
  module: string;
12
12
  /** Phase 5(D11):平台 op 的平台身份(中立 op 缺省)。 */
13
13
  engines?: readonly string[];
14
+ /** P26 (unit-system D8):参数量纲声明(参数名 → DimName)。 */
15
+ paramDims?: Record<string, string>;
16
+ /** P26 (unit-system D8):返回值量纲。 */
17
+ retDim?: string;
14
18
  }
15
19
  /** Cad script-face op manifest (B1: single source for cad namespace, check() symbol table). */
16
20
  export declare const SCRIPT_FACE_OPS: readonly ScriptFaceOp[];
@@ -1 +1 @@
1
- {"version":3,"file":"script-face-manifest.d.ts","sourceRoot":"","sources":["../../../src/api/generated/script-face-manifest.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,uBAAuB;AACvB,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B;AAED,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,SAAS,YAAY,EAyClD,CAAA"}
1
+ {"version":3,"file":"script-face-manifest.d.ts","sourceRoot":"","sources":["../../../src/api/generated/script-face-manifest.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,uBAAuB;AACvB,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,SAAS,YAAY,EAyClD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"script-face-manifest.js","sourceRoot":"","sources":["../../../src/api/generated/script-face-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * generated/script-face-manifest.ts — 生成文件,禁手改。\n * 由 packages/core/scripts/gen-l3-surface.ts 依据 api/surface/arg-spec.ts 生成。\n * cad 脚本面新增 op 清单(P23 B1 三源一致:导出面 ≡ cad 面 ≡ check() 符号表)。\n */\n\n/** 一条 cad 脚本面新增 op。 */\nexport interface ScriptFaceOp {\n /** faijs 面导出名(= brepjs 符号名)。 */\n name: string\n /** 所属分片模块(生成文件名)。 */\n module: string\n /** Phase 5(D11):平台 op 的平台身份(中立 op 缺省)。 */\n engines?: readonly string[]\n}\n\n/** Cad script-face op manifest (B1: single source for cad namespace, check() symbol table). */\nexport const SCRIPT_FACE_OPS: readonly ScriptFaceOp[] = [\n { name: 'torus', module: 'topology' },\n { name: 'fuse', module: 'topology', engines: [\"occt\"] },\n { name: 'inspectMassProps', module: 'measurement', engines: [\"occt\"] },\n { name: 'area', module: 'measurement' },\n { name: 'length', module: 'measurement' },\n { name: 'volume', module: 'measurement' },\n { name: 'centerOfMass', module: 'measurement' },\n { name: 'viewCamera', module: 'view' },\n { name: 'projectView', module: 'view' },\n { name: 'projectSheet', module: 'view' },\n { name: 'complexExtrude', module: 'operations', engines: [\"occt\"] },\n { name: 'twistExtrude', module: 'operations', engines: [\"occt\"] },\n { name: 'linearPattern', module: 'operations', engines: [\"occt\"] },\n { name: 'circularPattern', module: 'operations', engines: [\"occt\"] },\n { name: 'gridPattern', module: 'operations', engines: [\"occt\"] },\n { name: 'roof', module: 'operations' },\n { name: 'drill', module: 'operations' },\n { name: 'pocket', module: 'operations' },\n { name: 'boss', module: 'operations' },\n { name: 'mirrorJoin', module: 'operations' },\n { name: 'rectangularPattern', module: 'operations', engines: [\"occt\"] },\n { name: 'thread', module: 'operations', engines: [\"occt\"] },\n { name: 'convexHull', module: 'operations' },\n { name: 'makeBaseBox', module: 'sketching' },\n { name: 'ellipsoid', module: 'topology' },\n { name: 'rotate', module: 'topology' },\n { name: 'mirror', module: 'topology' },\n { name: 'clone', module: 'topology' },\n { name: 'applyMatrix', module: 'topology' },\n { name: 'locate', module: 'topology' },\n { name: 'split', module: 'topology', engines: [\"occt\"] },\n { name: 'offset', module: 'topology', engines: [\"occt\"] },\n { name: 'heal', module: 'topology', engines: [\"occt\"] },\n { name: 'simplify', module: 'topology', engines: [\"occt\"] },\n { name: 'isValid', module: 'topology' },\n { name: 'isSameShape', module: 'topology' },\n { name: 'autoHeal', module: 'topology', engines: [\"occt\"] },\n { name: 'fixShape', module: 'topology' },\n { name: 'healSolid', module: 'topology' },\n { name: 'fixSelfIntersection', module: 'topology', engines: [\"occt\"] },\n]\n"]}
1
+ {"version":3,"file":"script-face-manifest.js","sourceRoot":"","sources":["../../../src/api/generated/script-face-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * generated/script-face-manifest.ts — 生成文件,禁手改。\n * 由 packages/core/scripts/gen-l3-surface.ts 依据 api/surface/arg-spec.ts 生成。\n * cad 脚本面新增 op 清单(P23 B1 三源一致:导出面 ≡ cad 面 ≡ check() 符号表)。\n */\n\n/** 一条 cad 脚本面新增 op。 */\nexport interface ScriptFaceOp {\n /** faijs 面导出名(= brepjs 符号名)。 */\n name: string\n /** 所属分片模块(生成文件名)。 */\n module: string\n /** Phase 5(D11):平台 op 的平台身份(中立 op 缺省)。 */\n engines?: readonly string[]\n /** P26 (unit-system D8):参数量纲声明(参数名 → DimName)。 */\n paramDims?: Record<string, string>\n /** P26 (unit-system D8):返回值量纲。 */\n retDim?: string\n}\n\n/** Cad script-face op manifest (B1: single source for cad namespace, check() symbol table). */\nexport const SCRIPT_FACE_OPS: readonly ScriptFaceOp[] = [\n { name: 'torus', module: 'topology' },\n { name: 'fuse', module: 'topology', engines: [\"occt\"] },\n { name: 'inspectMassProps', module: 'measurement', engines: [\"occt\"] },\n { name: 'area', module: 'measurement' },\n { name: 'length', module: 'measurement' },\n { name: 'volume', module: 'measurement' },\n { name: 'centerOfMass', module: 'measurement' },\n { name: 'viewCamera', module: 'view' },\n { name: 'projectView', module: 'view' },\n { name: 'projectSheet', module: 'view' },\n { name: 'complexExtrude', module: 'operations', engines: [\"occt\"] },\n { name: 'twistExtrude', module: 'operations', engines: [\"occt\"] },\n { name: 'linearPattern', module: 'operations', engines: [\"occt\"] },\n { name: 'circularPattern', module: 'operations', engines: [\"occt\"] },\n { name: 'gridPattern', module: 'operations', engines: [\"occt\"] },\n { name: 'roof', module: 'operations' },\n { name: 'drill', module: 'operations' },\n { name: 'pocket', module: 'operations' },\n { name: 'boss', module: 'operations' },\n { name: 'mirrorJoin', module: 'operations' },\n { name: 'rectangularPattern', module: 'operations', engines: [\"occt\"] },\n { name: 'thread', module: 'operations', engines: [\"occt\"] },\n { name: 'convexHull', module: 'operations' },\n { name: 'makeBaseBox', module: 'sketching' },\n { name: 'ellipsoid', module: 'topology' },\n { name: 'rotate', module: 'topology' },\n { name: 'mirror', module: 'topology' },\n { name: 'clone', module: 'topology' },\n { name: 'applyMatrix', module: 'topology' },\n { name: 'locate', module: 'topology' },\n { name: 'split', module: 'topology', engines: [\"occt\"] },\n { name: 'offset', module: 'topology', engines: [\"occt\"] },\n { name: 'heal', module: 'topology', engines: [\"occt\"] },\n { name: 'simplify', module: 'topology', engines: [\"occt\"] },\n { name: 'isValid', module: 'topology' },\n { name: 'isSameShape', module: 'topology' },\n { name: 'autoHeal', module: 'topology', engines: [\"occt\"] },\n { name: 'fixShape', module: 'topology' },\n { name: 'healSolid', module: 'topology' },\n { name: 'fixSelfIntersection', module: 'topology', engines: [\"occt\"] },\n]\n"]}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * stdlib geom — $geom 查询函数族(有形签名)
2
+ * api geom — $geom 查询函数族(有形签名)
3
3
  *
4
4
  *
5
5
  * `cad.<feature>(of, anchor?, ordinal?)`:
package/dist/api/geom.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * stdlib geom — $geom 查询函数族(有形签名)
2
+ * api geom — $geom 查询函数族(有形签名)
3
3
  *
4
4
  *
5
5
  * `cad.<feature>(of, anchor?, ordinal?)`:
@@ -1 +1 @@
1
- {"version":3,"file":"geom.js","sourceRoot":"","sources":["../../src/api/geom.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib geom — $geom 查询函数族(有形签名)\n *\n *\n * `cad.<feature>(of, anchor?, ordinal?)`:\n * - of 是 Shape(编译产物 `ctx.<var>` 引用),非变量名\n * - faceNormal:faceOrdinal + brepOf(of) + kernel(拓扑引用)\n * 优先 → anchor 几何反查(兜底)→ 报错\n * - bboxCenter/bboxMin/bboxMax:mesh 包围盒查询\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { brepOf } from '../shape'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/** 内部实现:faceNormal 专用——faceOrdinal+BREP 优先 → anchor 反查 → 报错(逻辑迁移自 resolveGeomRef)。 */\nfunction geomQuery(\n of: Shape,\n anchor: Vec3 | undefined,\n faceOrdinal: number | undefined,\n): Vec3 {\n // 优先路径:faceOrdinal 拓扑引用(BREP 路径)\n if (faceOrdinal !== undefined) {\n const solid = brepOf(of) as BrepHandle | undefined\n const kernel = getBrepApi()\n if (solid && kernel) {\n try {\n const faces = kernel.getSubShapes(solid, 'face')\n if (faceOrdinal < faces.length) {\n const face = faces[faceOrdinal]\n // 面法向:用 surfaceNormal 在 (0.5, 0.5) 处取\n let normal: Vec3 = [0, 0, 1]\n try {\n const n = kernel.surfaceNormal(face, 0.5, 0.5)\n normal = [n.x, n.y, n.z]\n } catch {\n // surfaceNormal 可能对某些面失败,用默认法向\n }\n kernel.release(face)\n for (let i = 0; i < faces.length; i++) {\n if (i !== faceOrdinal) kernel.release(faces[i])\n }\n return normal\n }\n // ordinal 越界 → 释放并降级到 anchor\n for (const f of faces) kernel.release(f)\n } catch {\n // BREP 取面失败 → 降级到 anchor\n }\n }\n }\n\n // 兜底路径:anchor 几何反查\n if (!anchor) {\n throw new Error('[GeomRef] faceNormal requires anchor or faceOrdinal')\n }\n const face = cad.faceAt(of, { point: anchor })\n if (!face) {\n throw new Error(`[GeomRef] faceAt failed for anchor at ${anchor}`)\n }\n return face.normal\n}\n\n/**\n * 查询面上某点(锚点)的法向。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name faceNormal\n * @returns Vec3 面上锚点处的法向 [x,y,z]。\n * @param of - 目标几何(编译产物 ctx.<var> 引用)。type:Shape required:true\n * @param anchor - 锚点(几何反查兜底)。type:[x,y,z]\n * @param ordinal - 面序号(BREP 拓扑引用优先)。type:number\n * @example\n * const n = cad.faceNormal(part0, [0, 0, 5])\n */\nexport function faceNormal(of: Shape, anchor?: Vec3, ordinal?: number): Vec3 {\n return geomQuery(of, anchor, ordinal)\n}\n\n/**\n * 查询几何包围盒中心。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name bboxCenter\n * @returns Vec3 包围盒中心 [x,y,z]。交互式可编辑(参数量引用)。\n * @param of - 目标几何。type:Shape required:true\n * @example\n * const c = cad.bboxCenter(part0)\n */\nexport function bboxCenter(of: Shape): Vec3 {\n return cad.bboxCenter(of)\n}\n\n/**\n * 查询几何包围盒最小角点。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name bboxMin\n * @returns Vec3 包围盒最小角点 [x,y,z]。\n * @param of - 目标几何。type:Shape required:true\n * @example\n * const mn = cad.bboxMin(part0)\n */\nexport function bboxMin(of: Shape): Vec3 {\n return cad.boundingBox(of).min\n}\n\n/**\n * 查询几何包围盒最大角点。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name bboxMax\n * @returns Vec3 包围盒最大角点 [x,y,z]。\n * @param of - 目标几何。type:Shape required:true\n * @example\n * const mx = cad.bboxMax(part0)\n */\nexport function bboxMax(of: Shape): Vec3 {\n return cad.boundingBox(of).max\n}\n"]}
1
+ {"version":3,"file":"geom.js","sourceRoot":"","sources":["../../src/api/geom.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api geom — $geom 查询函数族(有形签名)\n *\n *\n * `cad.<feature>(of, anchor?, ordinal?)`:\n * - of 是 Shape(编译产物 `ctx.<var>` 引用),非变量名\n * - faceNormal:faceOrdinal + brepOf(of) + kernel(拓扑引用)\n * 优先 → anchor 几何反查(兜底)→ 报错\n * - bboxCenter/bboxMin/bboxMax:mesh 包围盒查询\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { brepOf } from '../shape'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/** 内部实现:faceNormal 专用——faceOrdinal+BREP 优先 → anchor 反查 → 报错(逻辑迁移自 resolveGeomRef)。 */\nfunction geomQuery(\n of: Shape,\n anchor: Vec3 | undefined,\n faceOrdinal: number | undefined,\n): Vec3 {\n // 优先路径:faceOrdinal 拓扑引用(BREP 路径)\n if (faceOrdinal !== undefined) {\n const solid = brepOf(of) as BrepHandle | undefined\n const kernel = getBrepApi()\n if (solid && kernel) {\n try {\n const faces = kernel.getSubShapes(solid, 'face')\n if (faceOrdinal < faces.length) {\n const face = faces[faceOrdinal]\n // 面法向:用 surfaceNormal 在 (0.5, 0.5) 处取\n let normal: Vec3 = [0, 0, 1]\n try {\n const n = kernel.surfaceNormal(face, 0.5, 0.5)\n normal = [n.x, n.y, n.z]\n } catch {\n // surfaceNormal 可能对某些面失败,用默认法向\n }\n kernel.release(face)\n for (let i = 0; i < faces.length; i++) {\n if (i !== faceOrdinal) kernel.release(faces[i])\n }\n return normal\n }\n // ordinal 越界 → 释放并降级到 anchor\n for (const f of faces) kernel.release(f)\n } catch {\n // BREP 取面失败 → 降级到 anchor\n }\n }\n }\n\n // 兜底路径:anchor 几何反查\n if (!anchor) {\n throw new Error('[GeomRef] faceNormal requires anchor or faceOrdinal')\n }\n const face = cad.faceAt(of, { point: anchor })\n if (!face) {\n throw new Error(`[GeomRef] faceAt failed for anchor at ${anchor}`)\n }\n return face.normal\n}\n\n/**\n * 查询面上某点(锚点)的法向。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name faceNormal\n * @returns Vec3 面上锚点处的法向 [x,y,z]。\n * @param of - 目标几何(编译产物 ctx.<var> 引用)。type:Shape required:true\n * @param anchor - 锚点(几何反查兜底)。type:[x,y,z]\n * @param ordinal - 面序号(BREP 拓扑引用优先)。type:number\n * @example\n * const n = cad.faceNormal(part0, [0, 0, 5])\n */\nexport function faceNormal(of: Shape, anchor?: Vec3, ordinal?: number): Vec3 {\n return geomQuery(of, anchor, ordinal)\n}\n\n/**\n * 查询几何包围盒中心。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name bboxCenter\n * @returns Vec3 包围盒中心 [x,y,z]。交互式可编辑(参数量引用)。\n * @param of - 目标几何。type:Shape required:true\n * @example\n * const c = cad.bboxCenter(part0)\n */\nexport function bboxCenter(of: Shape): Vec3 {\n return cad.bboxCenter(of)\n}\n\n/**\n * 查询几何包围盒最小角点。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name bboxMin\n * @returns Vec3 包围盒最小角点 [x,y,z]。\n * @param of - 目标几何。type:Shape required:true\n * @example\n * const mn = cad.bboxMin(part0)\n */\nexport function bboxMin(of: Shape): Vec3 {\n return cad.boundingBox(of).min\n}\n\n/**\n * 查询几何包围盒最大角点。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name bboxMax\n * @returns Vec3 包围盒最大角点 [x,y,z]。\n * @param of - 目标几何。type:Shape required:true\n * @example\n * const mx = cad.bboxMax(part0)\n */\nexport function bboxMax(of: Shape): Vec3 {\n return cad.boundingBox(of).max\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * stdlib helix — 螺旋线(1D 曲线,平台 op engines:['occt'])
2
+ * api helix — 螺旋线(1D 曲线,平台 op engines:['occt'])
3
3
  *
4
4
  * @platform occt — 本文件 import occt-kernel:螺旋线用 `makeHelixWire` 构造
5
5
  * (occt-wasm 原生有,L1 无)。守卫 ① 要求平台 import 自证身份;调用方 op 声明
package/dist/api/helix.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * stdlib helix — 螺旋线(1D 曲线,平台 op engines:['occt'])
2
+ * api helix — 螺旋线(1D 曲线,平台 op engines:['occt'])
3
3
  *
4
4
  * @platform occt — 本文件 import occt-kernel:螺旋线用 `makeHelixWire` 构造
5
5
  * (occt-wasm 原生有,L1 无)。守卫 ① 要求平台 import 自证身份;调用方 op 声明
@@ -1 +1 @@
1
- {"version":3,"file":"helix.js","sourceRoot":"","sources":["../../src/api/helix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAgBzD,sDAAsD;AACtD,SAAS,SAAS,CAAC,IAAkB;IACnC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IACrC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC5E,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAChF,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,KAAK,GAAG,KAAK,CAAA;IAC5B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,IAAI,GAAG,aAAa,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAC/B,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAC5C,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EACtC,KAAK,EACL,MAAM,EACN,MAAM,CACkB,CAAA;IAC1B,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AACvE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC5B,IAAI,CAAC,IAAkB;QACrB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,sCAAsC,EAAgB;CAC5F,CAAC,CAAA","sourcesContent":["/**\n * stdlib helix — 螺旋线(1D 曲线,平台 op engines:['occt'])\n *\n * @platform occt — 本文件 import occt-kernel:螺旋线用 `makeHelixWire` 构造\n * (occt-wasm 原生有,L1 无)。守卫 ① 要求平台 import 自证身份;调用方 op 声明\n * `engines: ['occt']` 由守卫 ② 校验。\n *\n * 用途:G-D 门控层的 1D 造线能力(Phase 3)。下游 sweep / loft 等可用螺旋线作 spine。\n *\n * 设计:\n * - 平台 op:occt 原生 makeHelixWire(occt-wasm 有,L1 无)→ 声明 engines:['occt'](D11)。\n * 不声明 capabilities:实现直连平台原生方法,能力由引擎身份本身界定。\n * - 1D 产物:经 fromBrepCurve 登记,kind='curve'。\n * - 非 occt 引擎(brepkit)→ 执行前 BrepUnsupportedError(D11-4);brep_mock 受 D11-3\n * 豁免不拦截(且 getOcctKernel 为全局 occt 实例,brep_mock 下仍可真实出线)。\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 { fromBrepCurve } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { getOcctKernel } from '../occt-kernel/occtKernel'\n\n/** `cad.helix` 参数。 */\nexport interface HelixOptions {\n /** 螺旋半径(mm,>0)。 */\n radius: number\n /** 螺距(mm,每圈沿轴的推进量,≠0)。 */\n pitch: number\n /** 圈数(>0)。 */\n turns: number\n /** 螺旋轴方向(单位向量,默认 +Z)。 */\n axis?: [number, number, number]\n /** 起点(默认原点)。 */\n origin?: [number, number, number]\n}\n\n/** BREP 路径:用 occt 原生 makeHelixWire 构造螺旋线,登记 1D 句柄。 */\nfunction helixBrep(opts: HelixOptions): Shape {\n const { radius, pitch, turns } = opts\n if (!(radius > 0)) throw new Error('E_HELIX_BAD_RADIUS: radius must be > 0')\n if (!(pitch !== 0)) throw new Error('E_HELIX_BAD_PITCH: pitch must be non-zero')\n if (!(turns > 0)) throw new Error('E_HELIX_BAD_TURNS: turns must be > 0')\n const axis = opts.axis ?? [0, 0, 1]\n const origin = opts.origin ?? [0, 0, 0]\n const height = pitch * turns\n const kernel = getBrepApi()\n const occt = getOcctKernel()\n const handle = occt.makeHelixWire(\n { x: origin[0], y: origin[1], z: origin[2] },\n { x: axis[0], y: axis[1], z: axis[2] },\n pitch,\n height,\n radius,\n ) as unknown as BrepHandle\n return fromBrepCurve(solidToShape(kernel, handle), { solid: handle })\n}\n\n/**\n * 构造螺旋线(1D 曲线)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name helix\n * @note 平台 op:仅 occt 引擎(原生 makeHelixWire)。非 occt 引擎执行前报错;brep_mock 不拦截。\n * @returns Shape 1D 螺旋线(kind:'curve')。\n * @param options.radius - 螺旋半径(mm,>0)。type:number required:true\n * @param options.pitch - 螺距(mm,≠0)。type:number required:true\n * @param options.turns - 圈数(>0)。type:number required:true\n * @param options.axis - 螺旋轴方向(默认 +Z)。type:Vec3 required:false\n * @param options.origin - 起点(默认原点)。type:Vec3 required:false\n * @example\n * const h = cad.helix({ radius: 5, pitch: 2, turns: 3 })\n */\nexport const helix = defineOp({\n brep(opts: HelixOptions) {\n return helixBrep(opts)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: 'construct vocabulary pending Phase 3' } as Provenance,\n})\n"]}
1
+ {"version":3,"file":"helix.js","sourceRoot":"","sources":["../../src/api/helix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAgBzD,sDAAsD;AACtD,SAAS,SAAS,CAAC,IAAkB;IACnC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IACrC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC5E,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAChF,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,KAAK,GAAG,KAAK,CAAA;IAC5B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,IAAI,GAAG,aAAa,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAC/B,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAC5C,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EACtC,KAAK,EACL,MAAM,EACN,MAAM,CACkB,CAAA;IAC1B,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AACvE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC5B,IAAI,CAAC,IAAkB;QACrB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,sCAAsC,EAAgB;CAC5F,CAAC,CAAA","sourcesContent":["/**\n * api helix — 螺旋线(1D 曲线,平台 op engines:['occt'])\n *\n * @platform occt — 本文件 import occt-kernel:螺旋线用 `makeHelixWire` 构造\n * (occt-wasm 原生有,L1 无)。守卫 ① 要求平台 import 自证身份;调用方 op 声明\n * `engines: ['occt']` 由守卫 ② 校验。\n *\n * 用途:G-D 门控层的 1D 造线能力(Phase 3)。下游 sweep / loft 等可用螺旋线作 spine。\n *\n * 设计:\n * - 平台 op:occt 原生 makeHelixWire(occt-wasm 有,L1 无)→ 声明 engines:['occt'](D11)。\n * 不声明 capabilities:实现直连平台原生方法,能力由引擎身份本身界定。\n * - 1D 产物:经 fromBrepCurve 登记,kind='curve'。\n * - 非 occt 引擎(brepkit)→ 执行前 BrepUnsupportedError(D11-4);brep_mock 受 D11-3\n * 豁免不拦截(且 getOcctKernel 为全局 occt 实例,brep_mock 下仍可真实出线)。\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 { fromBrepCurve } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { getOcctKernel } from '../occt-kernel/occtKernel'\n\n/** `cad.helix` 参数。 */\nexport interface HelixOptions {\n /** 螺旋半径(mm,>0)。 */\n radius: number\n /** 螺距(mm,每圈沿轴的推进量,≠0)。 */\n pitch: number\n /** 圈数(>0)。 */\n turns: number\n /** 螺旋轴方向(单位向量,默认 +Z)。 */\n axis?: [number, number, number]\n /** 起点(默认原点)。 */\n origin?: [number, number, number]\n}\n\n/** BREP 路径:用 occt 原生 makeHelixWire 构造螺旋线,登记 1D 句柄。 */\nfunction helixBrep(opts: HelixOptions): Shape {\n const { radius, pitch, turns } = opts\n if (!(radius > 0)) throw new Error('E_HELIX_BAD_RADIUS: radius must be > 0')\n if (!(pitch !== 0)) throw new Error('E_HELIX_BAD_PITCH: pitch must be non-zero')\n if (!(turns > 0)) throw new Error('E_HELIX_BAD_TURNS: turns must be > 0')\n const axis = opts.axis ?? [0, 0, 1]\n const origin = opts.origin ?? [0, 0, 0]\n const height = pitch * turns\n const kernel = getBrepApi()\n const occt = getOcctKernel()\n const handle = occt.makeHelixWire(\n { x: origin[0], y: origin[1], z: origin[2] },\n { x: axis[0], y: axis[1], z: axis[2] },\n pitch,\n height,\n radius,\n ) as unknown as BrepHandle\n return fromBrepCurve(solidToShape(kernel, handle), { solid: handle })\n}\n\n/**\n * 构造螺旋线(1D 曲线)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name helix\n * @note 平台 op:仅 occt 引擎(原生 makeHelixWire)。非 occt 引擎执行前报错;brep_mock 不拦截。\n * @returns Shape 1D 螺旋线(kind:'curve')。\n * @param options.radius - 螺旋半径(mm,>0)。type:number required:true\n * @param options.pitch - 螺距(mm,≠0)。type:number required:true\n * @param options.turns - 圈数(>0)。type:number required:true\n * @param options.axis - 螺旋轴方向(默认 +Z)。type:Vec3 required:false\n * @param options.origin - 起点(默认原点)。type:Vec3 required:false\n * @example\n * const h = cad.helix({ radius: 5, pitch: 2, turns: 3 })\n */\nexport const helix = defineOp({\n brep(opts: HelixOptions) {\n return helixBrep(opts)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: 'construct vocabulary pending Phase 3' } as Provenance,\n})\n"]}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * stdlib import_brep — 平台 BREP 资产导入 op(H11 / 方案 §4.1)
2
+ * api import_brep — 平台 BREP 资产导入 op(H11 / 方案 §4.1)
3
3
  *
4
4
  *
5
5
  * 与编辑器 `cad.load`(`api/load.ts`)的区别见方案 §4.5:
@@ -32,5 +32,23 @@ import type { Shape } from '../mesh/types.js';
32
32
  * @example
33
33
  * const a = await cad.import_brep({ asset: 'Array001.Shape' })
34
34
  */
35
- export declare function import_brep(params: Record<string, unknown>): Promise<Shape>;
35
+ /**
36
+ * 裸实现:契约层测试直调(不经 defineOp 的 dispatch 拦截)。
37
+ *
38
+ * @param params - op 参数对象;`asset` 为容器资产名(去扩展名)。
39
+ * @returns 持 OCCT 句柄的几何(非实体亦可)。
40
+ */
41
+ export declare function importBrepImpl(params: Record<string, unknown>): Promise<Shape>;
42
+ /**
43
+ * GOTCHA(2026-09-30):import_brep / import_step 必须经 defineOp 包装进入 cad
44
+ * 命名空间,不能是裸 async 函数。part 键 roleTable(outputTablesByPart)只在
45
+ * define-op.ts 包装层的 brep 分支登记(shape.ts attachBrep 只落语句键表,因为
46
+ * fromBrep 时刻 shape 还没被 executor 命名)。裸函数产物没有 part 键表 → 下游
47
+ * place 的 inputRoleTable(tableOfPart)拿到 undefined → place 产物 roleTable
48
+ * 断流 → edgeRef 报 "input shape has no role table (nameless shape)"
49
+ * (fcstd 语料 43 例,如 ISO4032_Hex_Nut_M10 的 chamfer(Pocket001__place))。
50
+ */
51
+ export declare const import_brep: ((params: Record<string, unknown>) => Promise<Shape>) & {
52
+ __faijs__dualOp?: import("../define-op.js").DualOpMeta;
53
+ };
36
54
  //# sourceMappingURL=import-brep.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"import-brep.d.ts","sourceRoot":"","sources":["../../src/api/import-brep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAQ1C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CA2CjF"}
1
+ {"version":3,"file":"import-brep.d.ts","sourceRoot":"","sources":["../../src/api/import-brep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAU1C;;;;;;;;;;;;;;;;;GAiBG;AACH;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CA2CpF;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW;;CAQtB,CAAA"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * stdlib import_brep — 平台 BREP 资产导入 op(H11 / 方案 §4.1)
2
+ * api import_brep — 平台 BREP 资产导入 op(H11 / 方案 §4.1)
3
3
  *
4
4
  *
5
5
  * 与编辑器 `cad.load`(`api/load.ts`)的区别见方案 §4.5:
@@ -17,6 +17,7 @@ import { getBackends, BrepUnsupportedError, getCurrentStmt } from '../runtime-st
17
17
  import { OpError } from './internal/result-unwrap.js';
18
18
  import { loadBrep } from '../brep/brep-ops.js';
19
19
  import { fromBrep } from '../shape.js';
20
+ import { defineOp } from '../sdk.js';
20
21
  /**
21
22
  * 平台 BREP 资产导入:把容器 `assets/` 里的冻结 BREP 载体装成持 OCCT 句柄的 Shape。
22
23
  *
@@ -35,7 +36,13 @@ import { fromBrep } from '../shape.js';
35
36
  * @example
36
37
  * const a = await cad.import_brep({ asset: 'Array001.Shape' })
37
38
  */
38
- export async function import_brep(params) {
39
+ /**
40
+ * 裸实现:契约层测试直调(不经 defineOp 的 dispatch 拦截)。
41
+ *
42
+ * @param params - op 参数对象;`asset` 为容器资产名(去扩展名)。
43
+ * @returns 持 OCCT 句柄的几何(非实体亦可)。
44
+ */
45
+ export async function importBrepImpl(params) {
39
46
  const assets = getBackends().assets;
40
47
  if (!assets || !assets.resolveByKey) {
41
48
  throw new OpError('import_brep', 'E_OP_FAILED', '[api/import_brep] assets backend is required');
@@ -51,7 +58,7 @@ export async function import_brep(params) {
51
58
  throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: import_brep requires an OCCT kernel (.brp assets have no mesh parser)');
52
59
  }
53
60
  // C6:非实体一等公民——始终允许导入 wire/face/shell(allowNonSolid=true)。
54
- const { solid: solidHandle, shape } = loadBrep(kernel, buffer, undefined, undefined, undefined, { allowNonSolid: true });
61
+ const { solid: solidHandle, shape } = loadBrep(kernel, buffer, undefined, undefined, { allowNonSolid: true });
55
62
  // E3(H12):链根建 roleTable(与 primitives.ts 同源机制)——冻结资产是
56
63
  // 无名形状,没有这张表下游 edgeRef/faceRef 无法解析(nameless-shape 缺陷)。
57
64
  // Phase 1.6:origin 用导入语句的 StmtId——同一资产导入两次是两条语句,
@@ -69,4 +76,22 @@ export async function import_brep(params) {
69
76
  roleTable: new Map([[stmtId, roles]]),
70
77
  });
71
78
  }
79
+ /**
80
+ * GOTCHA(2026-09-30):import_brep / import_step 必须经 defineOp 包装进入 cad
81
+ * 命名空间,不能是裸 async 函数。part 键 roleTable(outputTablesByPart)只在
82
+ * define-op.ts 包装层的 brep 分支登记(shape.ts attachBrep 只落语句键表,因为
83
+ * fromBrep 时刻 shape 还没被 executor 命名)。裸函数产物没有 part 键表 → 下游
84
+ * place 的 inputRoleTable(tableOfPart)拿到 undefined → place 产物 roleTable
85
+ * 断流 → edgeRef 报 "input shape has no role table (nameless shape)"
86
+ * (fcstd 语料 43 例,如 ISO4032_Hex_Nut_M10 的 chamfer(Pocket001__place))。
87
+ */
88
+ export const import_brep = defineOp({
89
+ name: 'import_brep',
90
+ brep: importBrepImpl,
91
+ engines: ['occt'],
92
+ // `imported:0` 是 <i> 采样值(同 extrude 的 `wall:0`):实际产出 imported:0..n-1,
93
+ // 与上面 roleTable 的 `imported:${i}` 逐字对齐。不能写成 semantic 'imported'——
94
+ // 它是结构 kind,出现在串首会被 parseRoleName 读成结构而非语义名(见 role-name.ts RESERVED_KEYWORDS)。
95
+ naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'imported', index: 0 }] } },
96
+ });
72
97
  //# sourceMappingURL=import-brep.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"import-brep.js","sourceRoot":"","sources":["../../src/api/import-brep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAInC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAA+B;IAC/D,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAEhB,CAAA;IACb,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACpC,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,aAAa,EAAE,8CAA8C,CAAC,CAAA;IACjG,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,mDAAmD,CAAC,CAAA;IACjG,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;IAEvD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,IAA4B,CAAA;IACnD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,oBAAoB,CAC5B,2FAA2F,CAC5F,CAAA;IACH,CAAC;IAED,0DAA0D;IAC1D,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,QAAQ,CAC5C,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CACzE,CAAA;IACD,qDAAqD;IACrD,wDAAwD;IACxD,iDAAiD;IACjD,6CAA6C;IAC7C,kFAAkF;IAClF,0FAA0F;IAC1F,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;IACrE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAA;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,EAAE;QACrB,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;KACtC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["/**\n * stdlib import_brep — 平台 BREP 资产导入 op(H11 / 方案 §4.1)\n *\n *\n * 与编辑器 `cad.load`(`api/load.ts`)的区别见方案 §4.5:\n * - `cad.load` 是 ../3d_editor 的「文件导入 Feature」(key/path/url 三键分流、\n * 语句位置约定、partIndex 画布语义),且历史契约要求实体。\n * - `cad.import_brep` 是 faijs **平台**几何 op:单一 asset 引用(容器资产名,\n * 去扩展名),语义是「把冻结的 BREP 载体装成持 OCCT 句柄的 Shape」。\n *\n * 非实体(wire/face/shell)一等公民(C6):不要求实体,始终 allowNonSolid。\n * 需要实体的操作(布尔、up-to 目标面)在使用点报错(V-C8)。\n *\n * BREP 专属:`.brp` 无 mesh 解析器;mesh / 无内核模式抛 E_BREP_UNSUPPORTED。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { getBackends, BrepUnsupportedError, getCurrentStmt } from '../runtime-state'\nimport { OpError } from './internal/result-unwrap'\nimport { loadBrep } from '../brep/brep-ops'\nimport { fromBrep } from '../shape'\n\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/**\n * 平台 BREP 资产导入:把容器 `assets/` 里的冻结 BREP 载体装成持 OCCT 句柄的 Shape。\n *\n * `asset` = 资产名(去扩展名,沿用 `FsAssetResolver` 的 `key = basename(file)` 规则),\n * 由宿主资产解析器按 key 解析(与 `cad.load` 同套解析器)。\n *\n * @group 创建\n * @inputs 0\n * @async true\n * @qual ok\n * @name import_brep\n * @param params.asset - 容器资产名(去扩展名)。type:string required:true\n * @note 非实体一等(C6):wire/face/shell 一律可导入,本 op 不设 `allowNonSolid` 一类开关。需要实体的 op(布尔、up-to 目标面)在**使用点**报错,而不是在导入点拒绝。\n * @note 这是**平台**资产导入 op。编辑器 `cad.load` 是 `../3d_editor` 的「文件导入 Feature」(key/path/url 三键分流 + 画布语句位置语义),平台侧不要复用它(C7)。\n * @returns Promise<Shape> 持 OCCT 句柄的几何(非实体亦可)。\n * @example\n * const a = await cad.import_brep({ asset: 'Array001.Shape' })\n */\nexport async function import_brep(params: Record<string, unknown>): Promise<Shape> {\n const assets = getBackends().assets as {\n resolveByKey?(key: string): Promise<{ bytes: ArrayBuffer }>\n } | undefined\n if (!assets || !assets.resolveByKey) {\n throw new OpError('import_brep', 'E_OP_FAILED', '[api/import_brep] assets backend is required')\n }\n\n const asset = params.asset\n if (typeof asset !== 'string' || asset.length === 0) {\n throw new OpError('import_brep', 'E_ARGS', '[api/import_brep] asset name (string) is required')\n }\n\n const buffer = (await assets.resolveByKey(asset)).bytes\n\n const { kernel: kernels } = getBackends()\n const kernel = kernels.brep as BrepEngineApi | null\n if (!kernel) {\n throw new BrepUnsupportedError(\n 'E_BREP_UNSUPPORTED: import_brep requires an OCCT kernel (.brp assets have no mesh parser)',\n )\n }\n\n // C6:非实体一等公民——始终允许导入 wire/face/shell(allowNonSolid=true)。\n const { solid: solidHandle, shape } = loadBrep(\n kernel, buffer, undefined, undefined, undefined, { allowNonSolid: true },\n )\n // E3(H12):链根建 roleTable(与 primitives.ts 同源机制)——冻结资产是\n // 无名形状,没有这张表下游 edgeRef/faceRef 无法解析(nameless-shape 缺陷)。\n // Phase 1.6:origin 用导入语句的 StmtId——同一资产导入两次是两条语句,\n // 各自产出的面天然分属不同 origin(旧实现用资产名,两次导入撞 origin)。\n // 3.8: imported:<i> — imported faces have no semantic names (arbitrary geometry),\n // named by enumeration order in the imported file (stable across re-import of same file).\n const stmtId = String(getCurrentStmt()?.id ?? '')\n const hashes = kernel.subShapeHashes(solidHandle, 'face', 2147483647)\n const roles = new Map<string, number[]>()\n for (let i = 0; i < hashes.length; i++) {\n roles.set(`imported:${i}`, [hashes[i]!])\n }\n return fromBrep(shape, {\n solid: solidHandle,\n roleTable: new Map([[stmtId, roles]]),\n })\n}\n"]}
1
+ {"version":3,"file":"import-brep.js","sourceRoot":"","sources":["../../src/api/import-brep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api import_brep — 平台 BREP 资产导入 op(H11 / 方案 §4.1)\n *\n *\n * 与编辑器 `cad.load`(`api/load.ts`)的区别见方案 §4.5:\n * - `cad.load` 是 ../3d_editor 的「文件导入 Feature」(key/path/url 三键分流、\n * 语句位置约定、partIndex 画布语义),且历史契约要求实体。\n * - `cad.import_brep` 是 faijs **平台**几何 op:单一 asset 引用(容器资产名,\n * 去扩展名),语义是「把冻结的 BREP 载体装成持 OCCT 句柄的 Shape」。\n *\n * 非实体(wire/face/shell)一等公民(C6):不要求实体,始终 allowNonSolid。\n * 需要实体的操作(布尔、up-to 目标面)在使用点报错(V-C8)。\n *\n * BREP 专属:`.brp` 无 mesh 解析器;mesh / 无内核模式抛 E_BREP_UNSUPPORTED。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { getBackends, BrepUnsupportedError, getCurrentStmt } from '../runtime-state'\nimport { OpError } from './internal/result-unwrap'\nimport { loadBrep } from '../brep/brep-ops'\nimport { fromBrep } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\n\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/**\n * 平台 BREP 资产导入:把容器 `assets/` 里的冻结 BREP 载体装成持 OCCT 句柄的 Shape。\n *\n * `asset` = 资产名(去扩展名,沿用 `FsAssetResolver` 的 `key = basename(file)` 规则),\n * 由宿主资产解析器按 key 解析(与 `cad.load` 同套解析器)。\n *\n * @group 创建\n * @inputs 0\n * @async true\n * @qual ok\n * @name import_brep\n * @param params.asset - 容器资产名(去扩展名)。type:string required:true\n * @note 非实体一等(C6):wire/face/shell 一律可导入,本 op 不设 `allowNonSolid` 一类开关。需要实体的 op(布尔、up-to 目标面)在**使用点**报错,而不是在导入点拒绝。\n * @note 这是**平台**资产导入 op。编辑器 `cad.load` 是 `../3d_editor` 的「文件导入 Feature」(key/path/url 三键分流 + 画布语句位置语义),平台侧不要复用它(C7)。\n * @returns Promise<Shape> 持 OCCT 句柄的几何(非实体亦可)。\n * @example\n * const a = await cad.import_brep({ asset: 'Array001.Shape' })\n */\n/**\n * 裸实现:契约层测试直调(不经 defineOp 的 dispatch 拦截)。\n *\n * @param params - op 参数对象;`asset` 为容器资产名(去扩展名)。\n * @returns 持 OCCT 句柄的几何(非实体亦可)。\n */\nexport async function importBrepImpl(params: Record<string, unknown>): Promise<Shape> {\n const assets = getBackends().assets as {\n resolveByKey?(key: string): Promise<{ bytes: ArrayBuffer }>\n } | undefined\n if (!assets || !assets.resolveByKey) {\n throw new OpError('import_brep', 'E_OP_FAILED', '[api/import_brep] assets backend is required')\n }\n\n const asset = params.asset\n if (typeof asset !== 'string' || asset.length === 0) {\n throw new OpError('import_brep', 'E_ARGS', '[api/import_brep] asset name (string) is required')\n }\n\n const buffer = (await assets.resolveByKey(asset)).bytes\n\n const { kernel: kernels } = getBackends()\n const kernel = kernels.brep as BrepEngineApi | null\n if (!kernel) {\n throw new BrepUnsupportedError(\n 'E_BREP_UNSUPPORTED: import_brep requires an OCCT kernel (.brp assets have no mesh parser)',\n )\n }\n\n // C6:非实体一等公民——始终允许导入 wire/face/shell(allowNonSolid=true)。\n const { solid: solidHandle, shape } = loadBrep(\n kernel, buffer, undefined, undefined, { allowNonSolid: true },\n )\n // E3(H12):链根建 roleTable(与 primitives.ts 同源机制)——冻结资产是\n // 无名形状,没有这张表下游 edgeRef/faceRef 无法解析(nameless-shape 缺陷)。\n // Phase 1.6:origin 用导入语句的 StmtId——同一资产导入两次是两条语句,\n // 各自产出的面天然分属不同 origin(旧实现用资产名,两次导入撞 origin)。\n // 3.8: imported:<i> — imported faces have no semantic names (arbitrary geometry),\n // named by enumeration order in the imported file (stable across re-import of same file).\n const stmtId = String(getCurrentStmt()?.id ?? '')\n const hashes = kernel.subShapeHashes(solidHandle, 'face', 2147483647)\n const roles = new Map<string, number[]>()\n for (let i = 0; i < hashes.length; i++) {\n roles.set(`imported:${i}`, [hashes[i]!])\n }\n return fromBrep(shape, {\n solid: solidHandle,\n roleTable: new Map([[stmtId, roles]]),\n })\n}\n\n/**\n * GOTCHA(2026-09-30):import_brep / import_step 必须经 defineOp 包装进入 cad\n * 命名空间,不能是裸 async 函数。part 键 roleTable(outputTablesByPart)只在\n * define-op.ts 包装层的 brep 分支登记(shape.ts attachBrep 只落语句键表,因为\n * fromBrep 时刻 shape 还没被 executor 命名)。裸函数产物没有 part 键表 → 下游\n * place 的 inputRoleTable(tableOfPart)拿到 undefined → place 产物 roleTable\n * 断流 → edgeRef 报 \"input shape has no role table (nameless shape)\"\n * (fcstd 语料 43 例,如 ISO4032_Hex_Nut_M10 的 chamfer(Pocket001__place))。\n */\nexport const import_brep = defineOp({\n name: 'import_brep',\n brep: importBrepImpl,\n engines: ['occt'],\n // `imported:0` 是 <i> 采样值(同 extrude 的 `wall:0`):实际产出 imported:0..n-1,\n // 与上面 roleTable 的 `imported:${i}` 逐字对齐。不能写成 semantic 'imported'——\n // 它是结构 kind,出现在串首会被 parseRoleName 读成结构而非语义名(见 role-name.ts RESERVED_KEYWORDS)。\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'imported', index: 0 }] } } as Provenance,\n})\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { Shape } from '../mesh/types.js';
2
2
  /**
3
- * stdlib import_step — 任意路径 STEP 文件导入 op(方案 Phase 5 / Q2 真缺口)
3
+ * api import_step — 任意路径 STEP 文件导入 op(方案 Phase 5 / Q2 真缺口)
4
4
  *
5
5
  * 与 `import_brep`(容器资产)和 `cad.load`(编辑器 FileRef)的职责切分:
6
6
  * - `cad.import_step` 是 faijs **平台**几何 op:单一本地路径(宿主 `resolveFile`),
@@ -24,5 +24,20 @@ import type { Shape } from '../mesh/types.js';
24
24
  * @example
25
25
  * const a = await cad.import_step({ path: 'D:/models/box.step' })
26
26
  */
27
- export declare function import_step(params: Record<string, unknown>): Promise<Shape>;
27
+ /**
28
+ * 裸实现:契约层测试直调(不经 defineOp 的 dispatch 拦截)。
29
+ *
30
+ * @param params - op 参数对象;`path` 为 STEP 文件路径。
31
+ * @returns 持 OCCT 句柄的几何(非实体亦可)。
32
+ */
33
+ export declare function importStepImpl(params: Record<string, unknown>): Promise<Shape>;
34
+ /**
35
+ * GOTCHA(2026-09-30):与 import_brep 同——必须经 defineOp 包装进入 cad 命名空间,
36
+ * 不能是裸 async 函数。part 键 roleTable(outputTablesByPart)只在 define-op.ts
37
+ * 包装层的 brep 分支登记;裸 async 函数产物没有 part 键表,下游 place/edgeRef
38
+ * 报 "input shape has no role table (nameless shape)"。
39
+ */
40
+ export declare const import_step: ((params: Record<string, unknown>) => Promise<Shape>) & {
41
+ __faijs__dualOp?: import("../define-op.js").DualOpMeta;
42
+ };
28
43
  //# sourceMappingURL=import-step.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"import-step.d.ts","sourceRoot":"","sources":["../../src/api/import-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAQ1C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAuCjF"}
1
+ {"version":3,"file":"import-step.d.ts","sourceRoot":"","sources":["../../src/api/import-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAU1C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAuCpF;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW;;CAMtB,CAAA"}