@faicad/faijs 0.29.3 → 0.30.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (614) hide show
  1. package/NOTICE +6 -5
  2. package/dist/api/api-namespace.d.ts +1 -1
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +53 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/appearance.d.ts +136 -0
  7. package/dist/api/appearance.d.ts.map +1 -0
  8. package/dist/api/appearance.js +228 -0
  9. package/dist/api/appearance.js.map +1 -0
  10. package/dist/api/assembly/entities.d.ts +1 -1
  11. package/dist/api/assembly/entities.js +1 -1
  12. package/dist/api/assembly/entities.js.map +1 -1
  13. package/dist/api/assembly/index.d.ts +1 -1
  14. package/dist/api/assembly/index.js +1 -1
  15. package/dist/api/assembly/index.js.map +1 -1
  16. package/dist/api/assembly/joints.d.ts +33 -15
  17. package/dist/api/assembly/joints.d.ts.map +1 -1
  18. package/dist/api/assembly/joints.js +31 -13
  19. package/dist/api/assembly/joints.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.js +1 -1
  22. package/dist/api/assembly/preview.js.map +1 -1
  23. package/dist/api/assembly/solve.d.ts +1 -1
  24. package/dist/api/assembly/solve.js +1 -1
  25. package/dist/api/assembly/solve.js.map +1 -1
  26. package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.js +1 -1
  28. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  29. package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
  30. package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
  31. package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
  32. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  33. package/dist/api/assembly/solvers/global-solver.js +3 -4
  34. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  35. package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
  36. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
  37. package/dist/api/assembly/solvers/linalg.d.ts +2 -2
  38. package/dist/api/assembly/solvers/linalg.js +2 -2
  39. package/dist/api/assembly/solvers/linalg.js.map +1 -1
  40. package/dist/api/assembly/solvers/types.d.ts +2 -5
  41. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  42. package/dist/api/assembly/solvers/types.js +1 -4
  43. package/dist/api/assembly/solvers/types.js.map +1 -1
  44. package/dist/api/boolean.d.ts.map +1 -1
  45. package/dist/api/boolean.js +7 -6
  46. package/dist/api/boolean.js.map +1 -1
  47. package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
  48. package/dist/api/brep-mirror/booleanFns.js +5 -5
  49. package/dist/api/brep-mirror/booleanFns.js.map +1 -1
  50. package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
  51. package/dist/api/brep-mirror/compoundFns.js +4 -4
  52. package/dist/api/brep-mirror/compoundFns.js.map +1 -1
  53. package/dist/api/brep-mirror/healingFns.d.ts +4 -4
  54. package/dist/api/brep-mirror/healingFns.js +4 -4
  55. package/dist/api/brep-mirror/healingFns.js.map +1 -1
  56. package/dist/api/brep-mirror/hullFns.d.ts +2 -2
  57. package/dist/api/brep-mirror/hullFns.js +2 -2
  58. package/dist/api/brep-mirror/hullFns.js.map +1 -1
  59. package/dist/api/brep-mirror/patternFns.d.ts +5 -5
  60. package/dist/api/brep-mirror/patternFns.js +10 -10
  61. package/dist/api/brep-mirror/patternFns.js.map +1 -1
  62. package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
  63. package/dist/api/brep-mirror/primitiveFns.js +4 -4
  64. package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
  65. package/dist/api/brep-mirror/roofFns.d.ts +3 -3
  66. package/dist/api/brep-mirror/roofFns.js +7 -7
  67. package/dist/api/brep-mirror/roofFns.js.map +1 -1
  68. package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
  69. package/dist/api/brep-mirror/sweepFns.js +14 -14
  70. package/dist/api/brep-mirror/sweepFns.js.map +1 -1
  71. package/dist/api/brep-mirror/threadFns.d.ts +1 -1
  72. package/dist/api/brep-mirror/threadFns.js +1 -1
  73. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  74. package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
  75. package/dist/api/brep-mirror/topologyFns.js +8 -8
  76. package/dist/api/brep-mirror/topologyFns.js.map +1 -1
  77. package/dist/api/brep-operations/booleanFns.d.ts +40 -0
  78. package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
  79. package/dist/api/brep-operations/booleanFns.js +104 -0
  80. package/dist/api/brep-operations/booleanFns.js.map +1 -0
  81. package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
  82. package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
  83. package/dist/api/brep-operations/brepHelpers.js +131 -0
  84. package/dist/api/brep-operations/brepHelpers.js.map +1 -0
  85. package/dist/api/brep-operations/compoundFns.d.ts +46 -0
  86. package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
  87. package/dist/api/brep-operations/compoundFns.js +299 -0
  88. package/dist/api/brep-operations/compoundFns.js.map +1 -0
  89. package/dist/api/brep-operations/healingFns.d.ts +78 -0
  90. package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
  91. package/dist/api/brep-operations/healingFns.js +294 -0
  92. package/dist/api/brep-operations/healingFns.js.map +1 -0
  93. package/dist/api/brep-operations/hullFns.d.ts +20 -0
  94. package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
  95. package/dist/api/brep-operations/hullFns.js +46 -0
  96. package/dist/api/brep-operations/hullFns.js.map +1 -0
  97. package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
  98. package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
  99. package/dist/api/brep-operations/joinery-brep.js +463 -0
  100. package/dist/api/brep-operations/joinery-brep.js.map +1 -0
  101. package/dist/api/brep-operations/patternFns.d.ts +43 -0
  102. package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
  103. package/dist/api/brep-operations/patternFns.js +178 -0
  104. package/dist/api/brep-operations/patternFns.js.map +1 -0
  105. package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
  106. package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
  107. package/dist/api/brep-operations/primitiveFns.js +104 -0
  108. package/dist/api/brep-operations/primitiveFns.js.map +1 -0
  109. package/dist/api/brep-operations/roofFns.d.ts +24 -0
  110. package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
  111. package/dist/api/brep-operations/roofFns.js +229 -0
  112. package/dist/api/brep-operations/roofFns.js.map +1 -0
  113. package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
  114. package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
  115. package/dist/api/brep-operations/straightSkeleton.js +431 -0
  116. package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
  117. package/dist/api/brep-operations/sweepFns.d.ts +60 -0
  118. package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
  119. package/dist/api/brep-operations/sweepFns.js +323 -0
  120. package/dist/api/brep-operations/sweepFns.js.map +1 -0
  121. package/dist/api/brep-operations/threadFns.d.ts +83 -0
  122. package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
  123. package/dist/api/brep-operations/threadFns.js +138 -0
  124. package/dist/api/brep-operations/threadFns.js.map +1 -0
  125. package/dist/api/brep-operations/topologyFns.d.ts +90 -0
  126. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
  127. package/dist/api/brep-operations/topologyFns.js +276 -0
  128. package/dist/api/brep-operations/topologyFns.js.map +1 -0
  129. package/dist/api/brep-topology.d.ts +1 -1
  130. package/dist/api/brep-topology.d.ts.map +1 -1
  131. package/dist/api/brep-topology.js +1 -1
  132. package/dist/api/brep-topology.js.map +1 -1
  133. package/dist/api/brepjs-compat/index.d.ts +1 -1
  134. package/dist/api/brepjs-compat/index.js +3 -3
  135. package/dist/api/brepjs-compat/index.js.map +1 -1
  136. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
  137. package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
  138. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
  139. package/dist/api/curve-sketch/index.d.ts +235 -0
  140. package/dist/api/curve-sketch/index.d.ts.map +1 -0
  141. package/dist/api/curve-sketch/index.js +487 -0
  142. package/dist/api/curve-sketch/index.js.map +1 -0
  143. package/dist/api/engrave.d.ts.map +1 -1
  144. package/dist/api/engrave.js +3 -2
  145. package/dist/api/engrave.js.map +1 -1
  146. package/dist/api/export-brep.d.ts +41 -0
  147. package/dist/api/export-brep.d.ts.map +1 -0
  148. package/dist/api/export-brep.js +58 -0
  149. package/dist/api/export-brep.js.map +1 -0
  150. package/dist/api/export-stl.d.ts +50 -0
  151. package/dist/api/export-stl.d.ts.map +1 -0
  152. package/dist/api/export-stl.js +99 -0
  153. package/dist/api/export-stl.js.map +1 -0
  154. package/dist/api/extrude.d.ts +8 -11
  155. package/dist/api/extrude.d.ts.map +1 -1
  156. package/dist/api/extrude.js +11 -14
  157. package/dist/api/extrude.js.map +1 -1
  158. package/dist/api/fillet-variable.d.ts +2 -2
  159. package/dist/api/fillet-variable.js +2 -2
  160. package/dist/api/fillet-variable.js.map +1 -1
  161. package/dist/api/fillet.d.ts +2 -4
  162. package/dist/api/fillet.d.ts.map +1 -1
  163. package/dist/api/fillet.js +2 -4
  164. package/dist/api/fillet.js.map +1 -1
  165. package/dist/api/generated/2d.d.ts +4 -0
  166. package/dist/api/generated/2d.d.ts.map +1 -1
  167. package/dist/api/generated/2d.js +4 -0
  168. package/dist/api/generated/2d.js.map +1 -1
  169. package/dist/api/generated/core.d.ts +4 -0
  170. package/dist/api/generated/core.d.ts.map +1 -1
  171. package/dist/api/generated/core.js +4 -0
  172. package/dist/api/generated/core.js.map +1 -1
  173. package/dist/api/generated/gear.d.ts +4 -0
  174. package/dist/api/generated/gear.d.ts.map +1 -1
  175. package/dist/api/generated/gear.js +4 -0
  176. package/dist/api/generated/gear.js.map +1 -1
  177. package/dist/api/generated/io.d.ts +4 -0
  178. package/dist/api/generated/io.d.ts.map +1 -1
  179. package/dist/api/generated/io.js +4 -0
  180. package/dist/api/generated/io.js.map +1 -1
  181. package/dist/api/generated/kernel.d.ts +4 -0
  182. package/dist/api/generated/kernel.d.ts.map +1 -1
  183. package/dist/api/generated/kernel.js +4 -0
  184. package/dist/api/generated/kernel.js.map +1 -1
  185. package/dist/api/generated/measurement.d.ts +21 -21
  186. package/dist/api/generated/measurement.d.ts.map +1 -1
  187. package/dist/api/generated/measurement.js +25 -21
  188. package/dist/api/generated/measurement.js.map +1 -1
  189. package/dist/api/generated/ns.d.ts +4 -0
  190. package/dist/api/generated/ns.d.ts.map +1 -1
  191. package/dist/api/generated/ns.js +4 -0
  192. package/dist/api/generated/ns.js.map +1 -1
  193. package/dist/api/generated/operations.d.ts +32 -32
  194. package/dist/api/generated/operations.d.ts.map +1 -1
  195. package/dist/api/generated/operations.js +52 -48
  196. package/dist/api/generated/operations.js.map +1 -1
  197. package/dist/api/generated/projection.d.ts +4 -0
  198. package/dist/api/generated/projection.d.ts.map +1 -1
  199. package/dist/api/generated/projection.js +4 -0
  200. package/dist/api/generated/projection.js.map +1 -1
  201. package/dist/api/generated/query.d.ts +4 -0
  202. package/dist/api/generated/query.d.ts.map +1 -1
  203. package/dist/api/generated/query.js +4 -0
  204. package/dist/api/generated/query.js.map +1 -1
  205. package/dist/api/generated/sketching.d.ts +2 -2
  206. package/dist/api/generated/sketching.d.ts.map +1 -1
  207. package/dist/api/generated/sketching.js +7 -3
  208. package/dist/api/generated/sketching.js.map +1 -1
  209. package/dist/api/generated/text.d.ts +4 -0
  210. package/dist/api/generated/text.d.ts.map +1 -1
  211. package/dist/api/generated/text.js +4 -0
  212. package/dist/api/generated/text.js.map +1 -1
  213. package/dist/api/generated/topology.d.ts +45 -45
  214. package/dist/api/generated/topology.d.ts.map +1 -1
  215. package/dist/api/generated/topology.js +67 -63
  216. package/dist/api/generated/topology.js.map +1 -1
  217. package/dist/api/generated/view.d.ts +4 -0
  218. package/dist/api/generated/view.d.ts.map +1 -1
  219. package/dist/api/generated/view.js +4 -0
  220. package/dist/api/generated/view.js.map +1 -1
  221. package/dist/api/geom-types/constants.d.ts +11 -0
  222. package/dist/api/geom-types/constants.d.ts.map +1 -0
  223. package/dist/api/geom-types/constants.js +11 -0
  224. package/dist/api/geom-types/constants.js.map +1 -0
  225. package/dist/api/geom-types/index.d.ts +21 -0
  226. package/dist/api/geom-types/index.d.ts.map +1 -0
  227. package/dist/api/geom-types/index.js +22 -0
  228. package/dist/api/geom-types/index.js.map +1 -0
  229. package/dist/api/geom-types/planeOps.d.ts +98 -0
  230. package/dist/api/geom-types/planeOps.d.ts.map +1 -0
  231. package/dist/api/geom-types/planeOps.js +170 -0
  232. package/dist/api/geom-types/planeOps.js.map +1 -0
  233. package/dist/api/geom-types/planeTypes.d.ts +24 -0
  234. package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
  235. package/dist/api/geom-types/planeTypes.js +8 -0
  236. package/dist/api/geom-types/planeTypes.js.map +1 -0
  237. package/dist/api/geom-types/types.d.ts +64 -0
  238. package/dist/api/geom-types/types.d.ts.map +1 -0
  239. package/dist/api/geom-types/types.js +48 -0
  240. package/dist/api/geom-types/types.js.map +1 -0
  241. package/dist/api/geom-types/vecOps.d.ts +124 -0
  242. package/dist/api/geom-types/vecOps.d.ts.map +1 -0
  243. package/dist/api/geom-types/vecOps.js +202 -0
  244. package/dist/api/geom-types/vecOps.js.map +1 -0
  245. package/dist/api/geom.d.ts.map +1 -1
  246. package/dist/api/geom.js +6 -5
  247. package/dist/api/geom.js.map +1 -1
  248. package/dist/api/half-space.d.ts +56 -0
  249. package/dist/api/half-space.d.ts.map +1 -0
  250. package/dist/api/half-space.js +82 -0
  251. package/dist/api/half-space.js.map +1 -0
  252. package/dist/api/helix.d.ts +10 -1
  253. package/dist/api/helix.d.ts.map +1 -1
  254. package/dist/api/helix.js +19 -3
  255. package/dist/api/helix.js.map +1 -1
  256. package/dist/api/import-step.d.ts.map +1 -1
  257. package/dist/api/import-step.js +28 -0
  258. package/dist/api/import-step.js.map +1 -1
  259. package/dist/api/index.d.ts +19 -6
  260. package/dist/api/index.d.ts.map +1 -1
  261. package/dist/api/index.js +31 -8
  262. package/dist/api/index.js.map +1 -1
  263. package/dist/api/internal/compat-op.d.ts +4 -30
  264. package/dist/api/internal/compat-op.d.ts.map +1 -1
  265. package/dist/api/internal/compat-op.js +10 -42
  266. package/dist/api/internal/compat-op.js.map +1 -1
  267. package/dist/api/internal/compat-projection.d.ts +5 -5
  268. package/dist/api/internal/compat-projection.js +5 -5
  269. package/dist/api/internal/compat-projection.js.map +1 -1
  270. package/dist/api/internal/dual-form-args.d.ts +0 -2
  271. package/dist/api/internal/dual-form-args.d.ts.map +1 -1
  272. package/dist/api/internal/dual-form-args.js +1 -3
  273. package/dist/api/internal/dual-form-args.js.map +1 -1
  274. package/dist/api/internal/l3-bridge.d.ts +5 -37
  275. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  276. package/dist/api/internal/l3-bridge.js +7 -76
  277. package/dist/api/internal/l3-bridge.js.map +1 -1
  278. package/dist/api/internal/profile-wire.d.ts +1 -1
  279. package/dist/api/internal/profile-wire.js +1 -1
  280. package/dist/api/internal/profile-wire.js.map +1 -1
  281. package/dist/api/internal/result-unwrap.d.ts +4 -6
  282. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  283. package/dist/api/internal/result-unwrap.js +4 -6
  284. package/dist/api/internal/result-unwrap.js.map +1 -1
  285. package/dist/api/knurl.d.ts.map +1 -1
  286. package/dist/api/knurl.js +5 -3
  287. package/dist/api/knurl.js.map +1 -1
  288. package/dist/api/loft.d.ts +2 -2
  289. package/dist/api/loft.d.ts.map +1 -1
  290. package/dist/api/loft.js +2 -2
  291. package/dist/api/loft.js.map +1 -1
  292. package/dist/api/measurement/index.d.ts +3 -3
  293. package/dist/api/measurement/index.js +3 -3
  294. package/dist/api/measurement/index.js.map +1 -1
  295. package/dist/api/meta.d.ts +91 -0
  296. package/dist/api/meta.d.ts.map +1 -0
  297. package/dist/api/meta.js +97 -0
  298. package/dist/api/meta.js.map +1 -0
  299. package/dist/api/offset2d.d.ts +49 -0
  300. package/dist/api/offset2d.d.ts.map +1 -0
  301. package/dist/api/offset2d.js +86 -0
  302. package/dist/api/offset2d.js.map +1 -0
  303. package/dist/api/pattern.js +3 -3
  304. package/dist/api/pattern.js.map +1 -1
  305. package/dist/api/primitives.d.ts.map +1 -1
  306. package/dist/api/primitives.js +124 -8
  307. package/dist/api/primitives.js.map +1 -1
  308. package/dist/api/replicate.d.ts +2 -2
  309. package/dist/api/replicate.d.ts.map +1 -1
  310. package/dist/api/replicate.js +12 -12
  311. package/dist/api/replicate.js.map +1 -1
  312. package/dist/api/result.d.ts +1 -1
  313. package/dist/api/result.js +1 -1
  314. package/dist/api/result.js.map +1 -1
  315. package/dist/api/revolve.d.ts +2 -2
  316. package/dist/api/revolve.js +3 -3
  317. package/dist/api/revolve.js.map +1 -1
  318. package/dist/api/screw.d.ts +1 -1
  319. package/dist/api/screw.d.ts.map +1 -1
  320. package/dist/api/screw.js +5 -4
  321. package/dist/api/screw.js.map +1 -1
  322. package/dist/api/sdf.d.ts.map +1 -1
  323. package/dist/api/sdf.js +3 -2
  324. package/dist/api/sdf.js.map +1 -1
  325. package/dist/api/shape-type/index.d.ts +141 -0
  326. package/dist/api/shape-type/index.d.ts.map +1 -0
  327. package/dist/api/shape-type/index.js +182 -0
  328. package/dist/api/shape-type/index.js.map +1 -0
  329. package/dist/api/shell.d.ts +2 -2
  330. package/dist/api/shell.js +2 -2
  331. package/dist/api/shell.js.map +1 -1
  332. package/dist/api/solid-from-faces.d.ts +45 -0
  333. package/dist/api/solid-from-faces.d.ts.map +1 -0
  334. package/dist/api/solid-from-faces.js +72 -0
  335. package/dist/api/solid-from-faces.js.map +1 -0
  336. package/dist/api/solid-offset/index.d.ts +67 -0
  337. package/dist/api/solid-offset/index.d.ts.map +1 -0
  338. package/dist/api/solid-offset/index.js +132 -0
  339. package/dist/api/solid-offset/index.js.map +1 -0
  340. package/dist/api/surface/arg-spec.d.ts +35 -33
  341. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  342. package/dist/api/surface/arg-spec.js +222 -224
  343. package/dist/api/surface/arg-spec.js.map +1 -1
  344. package/dist/api/surface-face/index.d.ts +104 -0
  345. package/dist/api/surface-face/index.d.ts.map +1 -0
  346. package/dist/api/surface-face/index.js +217 -0
  347. package/dist/api/surface-face/index.js.map +1 -0
  348. package/dist/api/surface.d.ts +44 -0
  349. package/dist/api/surface.d.ts.map +1 -0
  350. package/dist/api/surface.js +66 -0
  351. package/dist/api/surface.js.map +1 -0
  352. package/dist/api/sweep.d.ts +59 -9
  353. package/dist/api/sweep.d.ts.map +1 -1
  354. package/dist/api/sweep.js +11 -6
  355. package/dist/api/sweep.js.map +1 -1
  356. package/dist/api/thicken.d.ts +1 -1
  357. package/dist/api/thicken.js +1 -1
  358. package/dist/api/thicken.js.map +1 -1
  359. package/dist/api/transform.d.ts +5 -5
  360. package/dist/api/transform.d.ts.map +1 -1
  361. package/dist/api/transform.js +11 -10
  362. package/dist/api/transform.js.map +1 -1
  363. package/dist/api/view/cameraFns.d.ts +1 -1
  364. package/dist/api/view/cameraFns.d.ts.map +1 -1
  365. package/dist/api/view/cameraFns.js +1 -1
  366. package/dist/api/view/cameraFns.js.map +1 -1
  367. package/dist/api/view/index.d.ts +0 -2
  368. package/dist/api/view/index.d.ts.map +1 -1
  369. package/dist/api/view/index.js +0 -2
  370. package/dist/api/view/index.js.map +1 -1
  371. package/dist/api/view/projectionPlanes.d.ts +1 -1
  372. package/dist/api/view/projectionPlanes.d.ts.map +1 -1
  373. package/dist/api/view/projectionPlanes.js.map +1 -1
  374. package/dist/api/view/view-camera.d.ts +7 -9
  375. package/dist/api/view/view-camera.d.ts.map +1 -1
  376. package/dist/api/view/view-camera.js +4 -6
  377. package/dist/api/view/view-camera.js.map +1 -1
  378. package/dist/api/view/view-projection.d.ts +0 -2
  379. package/dist/api/view/view-projection.d.ts.map +1 -1
  380. package/dist/api/view/view-projection.js +0 -2
  381. package/dist/api/view/view-projection.js.map +1 -1
  382. package/dist/api/view/view-sheet.d.ts +0 -2
  383. package/dist/api/view/view-sheet.d.ts.map +1 -1
  384. package/dist/api/view/view-sheet.js +0 -2
  385. package/dist/api/view/view-sheet.js.map +1 -1
  386. package/dist/api/view-export/index.d.ts +97 -0
  387. package/dist/api/view-export/index.d.ts.map +1 -0
  388. package/dist/api/view-export/index.js +118 -0
  389. package/dist/api/view-export/index.js.map +1 -0
  390. package/dist/brep/brep-ops.d.ts +89 -1
  391. package/dist/brep/brep-ops.d.ts.map +1 -1
  392. package/dist/brep/brep-ops.js +204 -13
  393. package/dist/brep/brep-ops.js.map +1 -1
  394. package/dist/brep/brep-topology.d.ts +20 -0
  395. package/dist/brep/brep-topology.d.ts.map +1 -1
  396. package/dist/brep/brep-topology.js +46 -0
  397. package/dist/brep/brep-topology.js.map +1 -1
  398. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  399. package/dist/brep/engine/adapters/occt.js +8 -8
  400. package/dist/brep/engine/adapters/occt.js.map +1 -1
  401. package/dist/brep/engine/primitives.d.ts +2 -3
  402. package/dist/brep/engine/primitives.d.ts.map +1 -1
  403. package/dist/brep/engine/primitives.js +1 -2
  404. package/dist/brep/engine/primitives.js.map +1 -1
  405. package/dist/brep/engine/registry.d.ts +1 -1
  406. package/dist/brep/engine/registry.js +1 -1
  407. package/dist/brep/engine/registry.js.map +1 -1
  408. package/dist/brep/engine/types.d.ts +2 -2
  409. package/dist/brep/engine/types.js.map +1 -1
  410. package/dist/brep/export/export-model.d.ts +40 -0
  411. package/dist/brep/export/export-model.d.ts.map +1 -1
  412. package/dist/brep/export/export-model.js +268 -25
  413. package/dist/brep/export/export-model.js.map +1 -1
  414. package/dist/brep/export/step-meta-header.d.ts +102 -0
  415. package/dist/brep/export/step-meta-header.d.ts.map +1 -0
  416. package/dist/brep/export/step-meta-header.js +225 -0
  417. package/dist/brep/export/step-meta-header.js.map +1 -0
  418. package/dist/brep/export/step.d.ts +5 -1
  419. package/dist/brep/export/step.d.ts.map +1 -1
  420. package/dist/brep/export/step.js +11 -2
  421. package/dist/brep/export/step.js.map +1 -1
  422. package/dist/brep/handle-bridge.d.ts +2 -2
  423. package/dist/brep/handle-bridge.js +2 -2
  424. package/dist/brep/handle-bridge.js.map +1 -1
  425. package/dist/brep/index.d.ts +6 -3
  426. package/dist/brep/index.d.ts.map +1 -1
  427. package/dist/brep/index.js +6 -3
  428. package/dist/brep/index.js.map +1 -1
  429. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  430. package/dist/brepkit-kernel/brepkitKernel.js +2 -2
  431. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  432. package/dist/browser.d.ts +2 -2
  433. package/dist/browser.d.ts.map +1 -1
  434. package/dist/browser.js +5 -4
  435. package/dist/browser.js.map +1 -1
  436. package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
  437. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  438. package/dist/cad-runtime/admit-compat-lib.js +3 -9
  439. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  440. package/dist/cad-runtime/backend-dispatch.js +12 -3
  441. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  442. package/dist/cad-runtime/direct-executor.d.ts +6 -3
  443. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  444. package/dist/cad-runtime/direct-executor.js +31 -9
  445. package/dist/cad-runtime/direct-executor.js.map +1 -1
  446. package/dist/cad-runtime/interp/env.d.ts +1 -1
  447. package/dist/cad-runtime/interp/env.js.map +1 -1
  448. package/dist/cad-runtime/lib-id.d.ts +0 -2
  449. package/dist/cad-runtime/lib-id.d.ts.map +1 -1
  450. package/dist/cad-runtime/lib-id.js +0 -2
  451. package/dist/cad-runtime/lib-id.js.map +1 -1
  452. package/dist/cad-runtime/live-shapes.d.ts +3 -5
  453. package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
  454. package/dist/cad-runtime/live-shapes.js +8 -10
  455. package/dist/cad-runtime/live-shapes.js.map +1 -1
  456. package/dist/cad-runtime/ports.d.ts +3 -3
  457. package/dist/cad-runtime/ports.js.map +1 -1
  458. package/dist/cad-runtime/runtime.d.ts +21 -7
  459. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  460. package/dist/cad-runtime/runtime.js +45 -6
  461. package/dist/cad-runtime/runtime.js.map +1 -1
  462. package/dist/define-op.d.ts +4 -3
  463. package/dist/define-op.d.ts.map +1 -1
  464. package/dist/define-op.js +65 -3
  465. package/dist/define-op.js.map +1 -1
  466. package/dist/geometry2d/bridge/plane.d.ts +1 -1
  467. package/dist/geometry2d/bridge/plane.js +1 -1
  468. package/dist/geometry2d/bridge/plane.js.map +1 -1
  469. package/dist/geometry2d/curve2d.d.ts +1 -1
  470. package/dist/geometry2d/curve2d.js +1 -1
  471. package/dist/geometry2d/curve2d.js.map +1 -1
  472. package/dist/index.d.ts +1 -1
  473. package/dist/index.d.ts.map +1 -1
  474. package/dist/index.js +10 -4
  475. package/dist/index.js.map +1 -1
  476. package/dist/io/fai-zip/container-read.d.ts +16 -0
  477. package/dist/io/fai-zip/container-read.d.ts.map +1 -1
  478. package/dist/io/fai-zip/container-read.js +22 -0
  479. package/dist/io/fai-zip/container-read.js.map +1 -1
  480. package/dist/io/fai-zip/index.d.ts +1 -1
  481. package/dist/io/fai-zip/index.d.ts.map +1 -1
  482. package/dist/io/fai-zip/index.js +1 -1
  483. package/dist/io/fai-zip/index.js.map +1 -1
  484. package/dist/lang/code-to-args.d.ts.map +1 -1
  485. package/dist/lang/code-to-args.js +10 -1
  486. package/dist/lang/code-to-args.js.map +1 -1
  487. package/dist/lang/determinism-scanner.d.ts.map +1 -1
  488. package/dist/lang/determinism-scanner.js +22 -9
  489. package/dist/lang/determinism-scanner.js.map +1 -1
  490. package/dist/lang/metadata-extractor.d.ts +27 -6
  491. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  492. package/dist/lang/metadata-extractor.js +90 -29
  493. package/dist/lang/metadata-extractor.js.map +1 -1
  494. package/dist/lang/parse-error.d.ts +4 -0
  495. package/dist/lang/parse-error.d.ts.map +1 -1
  496. package/dist/lang/parse-error.js.map +1 -1
  497. package/dist/lang/security-scanner.d.ts +27 -2
  498. package/dist/lang/security-scanner.d.ts.map +1 -1
  499. package/dist/lang/security-scanner.js +29 -2
  500. package/dist/lang/security-scanner.js.map +1 -1
  501. package/dist/lang/source-edit.d.ts +2 -2
  502. package/dist/lang/source-edit.js.map +1 -1
  503. package/dist/lang/symbol-table.generated.d.ts +36 -0
  504. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  505. package/dist/lang/symbol-table.generated.js +36 -0
  506. package/dist/lang/symbol-table.generated.js.map +1 -1
  507. package/dist/lang/types.d.ts +5 -6
  508. package/dist/lang/types.d.ts.map +1 -1
  509. package/dist/lang/types.js.map +1 -1
  510. package/dist/mesh/import-model.d.ts +94 -0
  511. package/dist/mesh/import-model.d.ts.map +1 -0
  512. package/dist/mesh/import-model.js +15 -0
  513. package/dist/mesh/import-model.js.map +1 -0
  514. package/dist/mesh/index.d.ts +19 -58
  515. package/dist/mesh/index.d.ts.map +1 -1
  516. package/dist/mesh/index.js +19 -70
  517. package/dist/mesh/index.js.map +1 -1
  518. package/dist/mesh/io.d.ts +39 -16
  519. package/dist/mesh/io.d.ts.map +1 -1
  520. package/dist/mesh/io.js +151 -22
  521. package/dist/mesh/io.js.map +1 -1
  522. package/dist/mesh/primitives.d.ts.map +1 -1
  523. package/dist/mesh/primitives.js +42 -7
  524. package/dist/mesh/primitives.js.map +1 -1
  525. package/dist/mesh/threemf-bambu.d.ts +12 -1
  526. package/dist/mesh/threemf-bambu.d.ts.map +1 -1
  527. package/dist/mesh/threemf-bambu.js +68 -16
  528. package/dist/mesh/threemf-bambu.js.map +1 -1
  529. package/dist/mesh/threemf-loader.d.ts +37 -1
  530. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  531. package/dist/mesh/threemf-loader.js +205 -14
  532. package/dist/mesh/threemf-loader.js.map +1 -1
  533. package/dist/mesh/transform.d.ts +1 -1
  534. package/dist/mesh/transform.js +1 -1
  535. package/dist/mesh/transform.js.map +1 -1
  536. package/dist/mesh/types.d.ts +43 -5
  537. package/dist/mesh/types.d.ts.map +1 -1
  538. package/dist/mesh/types.js.map +1 -1
  539. package/dist/node-host/cli.d.ts +49 -1
  540. package/dist/node-host/cli.d.ts.map +1 -1
  541. package/dist/node-host/cli.js +125 -19
  542. package/dist/node-host/cli.js.map +1 -1
  543. package/dist/node-host/execute-script.d.ts +55 -0
  544. package/dist/node-host/execute-script.d.ts.map +1 -0
  545. package/dist/node-host/execute-script.js +46 -0
  546. package/dist/node-host/execute-script.js.map +1 -0
  547. package/dist/node.d.ts +2 -0
  548. package/dist/node.d.ts.map +1 -1
  549. package/dist/node.js +3 -0
  550. package/dist/node.js.map +1 -1
  551. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
  552. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
  553. package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
  554. package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
  555. package/dist/occt-kernel/highLevelApi.d.ts +4 -1
  556. package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
  557. package/dist/occt-kernel/highLevelApi.js +4 -2
  558. package/dist/occt-kernel/highLevelApi.js.map +1 -1
  559. package/dist/occt-kernel/hullGeometry.d.ts +2 -2
  560. package/dist/occt-kernel/hullGeometry.js +2 -3
  561. package/dist/occt-kernel/hullGeometry.js.map +1 -1
  562. package/dist/occt-kernel/hullOps.d.ts +3 -3
  563. package/dist/occt-kernel/hullOps.js +4 -4
  564. package/dist/occt-kernel/hullOps.js.map +1 -1
  565. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  566. package/dist/occt-kernel/occt-primitives.js +32 -5
  567. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  568. package/dist/occt-kernel/occtKernel.d.ts +1 -1
  569. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  570. package/dist/occt-kernel/occtKernel.js +19 -1
  571. package/dist/occt-kernel/occtKernel.js.map +1 -1
  572. package/dist/occt-kernel/stepMetaParser.d.ts +44 -0
  573. package/dist/occt-kernel/stepMetaParser.d.ts.map +1 -0
  574. package/dist/occt-kernel/stepMetaParser.js +166 -0
  575. package/dist/occt-kernel/stepMetaParser.js.map +1 -0
  576. package/dist/occt-scan/recognize.d.ts +58 -0
  577. package/dist/occt-scan/recognize.d.ts.map +1 -0
  578. package/dist/occt-scan/recognize.js +216 -0
  579. package/dist/occt-scan/recognize.js.map +1 -0
  580. package/dist/primitives/brep-primitives.js +7 -7
  581. package/dist/primitives/brep-primitives.js.map +1 -1
  582. package/dist/result/bug.d.ts +1 -1
  583. package/dist/result/bug.js +1 -1
  584. package/dist/result/bug.js.map +1 -1
  585. package/dist/result/errors.d.ts +2 -2
  586. package/dist/result/errors.d.ts.map +1 -1
  587. package/dist/result/errors.js +1 -1
  588. package/dist/result/errors.js.map +1 -1
  589. package/dist/result/vec3.d.ts +1 -1
  590. package/dist/result/vec3.js +1 -1
  591. package/dist/result/vec3.js.map +1 -1
  592. package/dist/runtime-state.d.ts +16 -0
  593. package/dist/runtime-state.d.ts.map +1 -1
  594. package/dist/runtime-state.js +27 -0
  595. package/dist/runtime-state.js.map +1 -1
  596. package/dist/script-globals.d.ts +24 -0
  597. package/dist/script-globals.d.ts.map +1 -0
  598. package/dist/script-globals.js +24 -0
  599. package/dist/script-globals.js.map +1 -0
  600. package/dist/shape.d.ts +35 -3
  601. package/dist/shape.d.ts.map +1 -1
  602. package/dist/shape.js +44 -2
  603. package/dist/shape.js.map +1 -1
  604. package/dist/step/stepMetaParser.d.ts +55 -0
  605. package/dist/step/stepMetaParser.d.ts.map +1 -0
  606. package/dist/step/stepMetaParser.js +177 -0
  607. package/dist/step/stepMetaParser.js.map +1 -0
  608. package/dist/topology/naming/lineage.d.ts +3 -2
  609. package/dist/topology/naming/lineage.d.ts.map +1 -1
  610. package/dist/topology/naming/lineage.js.map +1 -1
  611. package/dist/weapp.d.ts +1 -1
  612. package/dist/weapp.js +1 -1
  613. package/dist/weapp.js.map +1 -1
  614. package/package.json +9 -11
@@ -5,7 +5,7 @@ const asShape = (h) => h;
5
5
  const shapes = (hs) => hs.map(asShape);
6
6
  const v3 = (v) => ({ x: v.x, y: v.y, z: v.z });
7
7
  const rad = (deg) => (deg * Math.PI) / 180;
8
- /** brepjs topology layer uses this upper bound for face hashes (HASH_CODE_MAX). */
8
+ /** Topology layer uses this upper bound for face hashes (HASH_CODE_MAX). */
9
9
  const HASH_UPPER_BOUND = 2 ** 24;
10
10
  /**
11
11
  * Build a large planar face (boolean tool) through `point`, oriented by
@@ -63,8 +63,8 @@ export async function createOcctPrimitives() {
63
63
  // the property again recurses into the wrapper).
64
64
  const nativeLinearPattern = raw.linearPattern.bind(k);
65
65
  // 2026-09-25 core-decouple Phase 2(§5.1):hull 最小闭包已移植进 occt-kernel/
66
- // (hullGeometry + hullOps,occt-wasm 原生直调),此处不再经 vendored
67
- // OcctWasmAdapter——core 自有引擎对 brepjs 适配器的最后一处依赖已拔除。
66
+ // (hullGeometry + hullOps,occt-wasm 原生直调),此处不再经
67
+ // OcctWasmAdapter——core 自有引擎对旧适配器的最后一处依赖已拔除。
68
68
  const splitCompoundToArray = (compound) => {
69
69
  const parts = k.getSubShapes(compound, 'solid').map(asHandle);
70
70
  k.release(compound);
@@ -176,7 +176,34 @@ export async function createOcctPrimitives() {
176
176
  transform: (shape, matrix) => asHandle(k.transform(asShape(shape), matrix)),
177
177
  located: (shape, matrix) => asHandle(k.located(asShape(shape), matrix)),
178
178
  locate: (shape, matrix) => asHandle(k.located(asShape(shape), matrix)),
179
- generalTransform: (shape, matrix) => asHandle(k.generalTransform(asShape(shape), matrix)),
179
+ generalTransform: (shape, matrix) => {
180
+ // GOTCHA (2026-10-07, openscad example023 parity): the native `gp_GTrsf`
181
+ // path returns a handle whose *stored triangulation* double-applies the
182
+ // translated face's TopLoc. The exact geometry is right; only the
183
+ // tessellation is wrong, so the defect only shows on an **already meshed**
184
+ // shape — and every `cad.extrude`/boolean result is meshed for display
185
+ // (`brep-ops.ts#solidToShape`). Measured on an extruded face-with-hole
186
+ // prism: exact top cap 5.0, tessellated top cap 10.0 (non-uniform z×2.5:
187
+ // 12.5 vs 17.5). `BRepBuilderAPI_Copy` yields a shape without the stale
188
+ // triangulation, so the result re-tessellates correctly.
189
+ //
190
+ // Deliberately adapter-local, not in the engine-neutral dispatcher
191
+ // (`brep/brep-ops.ts#applyAffineBrep`): the defect is **occt-only** —
192
+ // brepkit's GTrsf path is clean (pinned by
193
+ // test/brep/applymatrix-similarity-routing.test.ts). Making every engine
194
+ // pay an extra handle allocation for an occt quirk also perturbed
195
+ // brepkit's `cut` bbox in test/brep/engine/multi-engine-op-parity.test.ts.
196
+ //
197
+ // Safety: the copy is adapter-owned and released here; the returned handle
198
+ // is independent of it (the native op does not consume its input).
199
+ const copy = k.copy(asShape(shape));
200
+ try {
201
+ return asHandle(k.generalTransform(copy, matrix));
202
+ }
203
+ finally {
204
+ k.release(copy);
205
+ }
206
+ },
180
207
  copy: (shape) => asHandle(k.copy(asShape(shape))),
181
208
  copyShape: (shape) => asHandle(k.copy(asShape(shape))),
182
209
  composeTransform: (m1, m2) => k.composeTransform(m1, m2),
@@ -337,7 +364,7 @@ export async function createOcctPrimitives() {
337
364
  // pass through the projection result; callers treat it as opaque (unknown).
338
365
  k.projectEdges(asShape(shape), origin, direction, xAxis),
339
366
  // ── measurement ──
340
- getBoundingBox: (shape, useTriangulation) => k.getBoundingBox(asShape(shape), useTriangulation),
367
+ getBoundingBox: (shape, useTriangulation) => k.getBoundingBox(asShape(shape), useTriangulation ?? false),
341
368
  getVolume: (shape) => k.getVolume(asShape(shape)),
342
369
  getCenterOfMass: (shape) => v3(k.getCenterOfMass(asShape(shape))),
343
370
  getSurfaceArea: (shape) => k.getSurfaceArea(asShape(shape)),
@@ -1 +1 @@
1
- {"version":3,"file":"occt-primitives.js","sourceRoot":"","sources":["../../src/occt-kernel/occt-primitives.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * occt-kernel/occt-primitives — `createOcctPrimitives()`: the L1 contract\n * (`BrepEngineApi`) adapter over the raw occt-wasm `OcctKernel` singleton.\n *\n * Plan Phase 3.2 (docs/plans/2026-09-24-brep-engine-api-narrowing-native-access.md):\n * explicit object literal, one method per L1 contract member — no monkey\n * patching, no cross-layer assertion lies, no unsupported() stubs. Every member\n * here is either a direct pass-through to the native kernel or an adapter-side\n * dialect digestion, both honestly implementing the contract.\n *\n * Occt-only capabilities (loft family, tool-entity section/split, *WithHistory\n * beyond the L1 trio, XCAF, SVG projection …) are deliberately NOT here —\n * platform code reaches them through the native face: `getOcctKernel()` (D3).\n */\nimport type {\n EdgeData,\n EvolutionData,\n Mesh,\n OcctKernel,\n ShapeHandle,\n Vec3,\n} from 'occt-wasm'\nimport { initOcctWasm } from './occtKernel'\nimport { hullFromPoints as hullFromPointsCore } from './hullOps'\nimport type { AssertSatisfiesBrepEngineApi, BrepEngineApi } from '../brep/engine/primitives'\nimport type {\n BrepBoundingBox,\n BrepCurveParameters,\n BrepEdgeData,\n BrepEvolutionData,\n BrepHandle,\n BrepMeshResult,\n BrepUvBounds,\n BrepVec3,\n} from '../brep/engine/types'\n\nconst asHandle = (h: number | ShapeHandle): BrepHandle => h as BrepHandle\nconst asShape = (h: BrepHandle): ShapeHandle => h as unknown as ShapeHandle\nconst shapes = (hs: BrepHandle[]): ShapeHandle[] => hs.map(asShape)\nconst v3 = (v: Vec3): BrepVec3 => ({ x: v.x, y: v.y, z: v.z })\nconst rad = (deg: number): number => (deg * Math.PI) / 180\n\n/** brepjs topology layer uses this upper bound for face hashes (HASH_CODE_MAX). */\nconst HASH_UPPER_BOUND = 2 ** 24\n\n/** occt-wasm native linearPattern/circularPattern return ONE compound handle\n * containing all replicas (the wasm d.ts type lies by claiming a plain handle).\n * The adapter captures the native methods, then splits the compound via\n * getSubShapes('solid') into the BrepHandle[] the L1 contract promises. */\ntype OcctPatternRaw = {\n linearPattern(shape: ShapeHandle, direction: Vec3, spacing: number, count: number): ShapeHandle\n circularPattern(shape: ShapeHandle, center: Vec3, axis: Vec3, angle: number, count: number): ShapeHandle\n}\n\n/**\n * Build a large planar face (boolean tool) through `point`, oriented by\n * `normal`. The face is constructed directly in the plane's own basis\n * (u ⊥ v ⊥ normal, through point) — no post-rotation needed, any normal\n * direction works (the Phase 1 probe only pinned +Z; this generalizes it).\n */\nfunction makePlanarFaceTool(k: OcctKernel, point: BrepVec3, normal: BrepVec3): ShapeHandle {\n const size = 500 // large enough to fully cut any reasonable solid\n // Pick the axis component with the smallest magnitude to build a stable\n // perpendicular basis (avoids degeneracy when normal is axis-aligned).\n const ax = Math.abs(normal.x)\n const ay = Math.abs(normal.y)\n const az = Math.abs(normal.z)\n let u: BrepVec3\n if (ax <= ay && ax <= az) u = { x: 0, y: -normal.z, z: normal.y }\n else if (ay <= az) u = { x: -normal.z, y: 0, z: normal.x }\n else u = { x: normal.y, y: -normal.x, z: 0 }\n const ul = Math.hypot(u.x, u.y, u.z)\n u = { x: u.x / ul, y: u.y / ul, z: u.z / ul }\n const v: BrepVec3 = {\n x: normal.y * u.z - normal.z * u.y,\n y: normal.z * u.x - normal.x * u.z,\n z: normal.x * u.y - normal.y * u.x,\n }\n const corner = (a: number, b: number): Vec3 => ({\n x: point.x + (u.x * a + v.x * b) * size,\n y: point.y + (u.y * a + v.y * b) * size,\n z: point.z + (u.z * a + v.z * b) * size,\n })\n const e1 = k.makeLineEdge(corner(-1, -1), corner(1, -1))\n const e2 = k.makeLineEdge(corner(1, -1), corner(1, 1))\n const e3 = k.makeLineEdge(corner(1, 1), corner(-1, 1))\n const e4 = k.makeLineEdge(corner(-1, 1), corner(-1, -1))\n const wire = k.makeWire([e1, e2, e3, e4])\n const face = k.makeFace(wire)\n k.release(wire)\n return face\n}\n\n/**\n * Create the occt implementation of the L1 engine contract. Idempotent-friendly:\n * the wasm kernel is a process-level singleton (see initOcctWasm), each call\n * returns a fresh adapter object over the same kernel.\n *\n * @returns a BrepEngineApi implementation backed by the occt wasm kernel.\n */\nexport async function createOcctPrimitives(): Promise<BrepEngineApi> {\n const k = await initOcctWasm()\n const raw = k as unknown as OcctPatternRaw\n // Capture native pattern methods BEFORE any wiring so gridPattern composes\n // on true native semantics (old adapter GOTCHA: after overwriting, calling\n // the property again recurses into the wrapper).\n const nativeLinearPattern = raw.linearPattern.bind(k)\n // 2026-09-25 core-decouple Phase 2(§5.1):hull 最小闭包已移植进 occt-kernel/\n // (hullGeometry + hullOps,occt-wasm 原生直调),此处不再经 vendored\n // OcctWasmAdapter——core 自有引擎对 brepjs 适配器的最后一处依赖已拔除。\n\n const splitCompoundToArray = (compound: ShapeHandle): BrepHandle[] => {\n const parts = k.getSubShapes(compound, 'solid').map(asHandle)\n k.release(compound)\n return parts\n }\n\n const toEvolution = (e: EvolutionData): BrepEvolutionData => ({\n // occt-wasm's EvolutionData already carries the segmented\n // [inHash, count, outHash…] encoding pinned by phase0-kernel-probes\n // (its own docs claim flat maps — docs are wrong, data is segmented).\n result: asHandle(e.result),\n modified: e.modified,\n generated: e.generated,\n deleted: e.deleted,\n })\n\n const primitives: BrepEngineApi = {\n // ── lifecycle ──\n release: (shape) => k.release(asShape(shape)),\n dispose: (shape) => {\n if (shape !== undefined) k.release(asShape(shape))\n },\n\n // ── solids ──\n makeBox: (dx, dy, dz) => asHandle(k.makeBox(dx, dy, dz)),\n makeBoxFromCorners: (c1, c2) => asHandle(k.makeBoxFromCorners(c1, c2)),\n makeCylinder: (radius, height) => asHandle(k.makeCylinder(radius, height)),\n makeSphere: (radius) => asHandle(k.makeSphere(radius)),\n makeCone: (r1, r2, height) => asHandle(k.makeCone(r1, r2, height)),\n makeRectangle: (w, h) => asHandle(k.makeRectangle(w, h)),\n makeEllipsoid: (rx, ry, rz) => asHandle(k.makeEllipsoid(rx, ry, rz)),\n makeTorus: (major, minor) => asHandle(k.makeTorus(major, minor)),\n makeVertex: (x, y, z) => asHandle(k.makeVertex(x, y, z)),\n\n // ── shaping ──\n extrude: (shape, dx, dy, dz) => asHandle(k.extrude(asShape(shape), dx, dy, dz)),\n revolveVec: (shape, center, direction, angleDeg) =>\n asHandle(k.revolve(asShape(shape), { point: center, direction }, rad(angleDeg))),\n sew: (list, tolerance) => asHandle(k.sew(shapes(list), tolerance)),\n sewAndSolidify: (faces, tolerance) => asHandle(k.sewAndSolidify(shapes(faces), tolerance)),\n shell: (solid, facesToRemove, thickness, tolerance) =>\n asHandle(k.shell(asShape(solid), shapes(facesToRemove), thickness, tolerance)),\n hullFromPoints: (points, tolerance) => hullFromPointsCore(k, points as never, tolerance),\n\n // ── booleans & splitting ──\n fuse: (a, b) => asHandle(k.fuse(asShape(a), asShape(b))),\n cut: (a, b) => asHandle(k.cut(asShape(a), asShape(b))),\n common: (a, b) => asHandle(k.common(asShape(a), asShape(b))),\n intersect: (a, b) => asHandle(k.intersect(asShape(a), asShape(b))),\n fuseAll: (list) => asHandle(k.fuseAll(shapes(list))),\n sectionByPlane: (shape, point, normal) => {\n // Phase 1 probe A (phase1-semantic-probes.test.ts): a planar face used as\n // the section tool yields the plane-section geometry. Downcast the result\n // compound into edge/wire handles; a non-compound result passes through.\n const tool = makePlanarFaceTool(k, point, normal)\n try {\n const result = k.section(asShape(shape), tool)\n if (k.isNull(result)) return []\n const out: BrepHandle[] = []\n for (const t of ['edge', 'wire'] as const) {\n for (const part of k.getSubShapes(result, t)) out.push(asHandle(k.downcast(part, t)))\n }\n if (out.length === 0) {\n // No intersection: native section still yields an (empty) compound —\n // release it and return an empty list so callers can detect the miss\n // instead of adopting an empty compound as a \"curve\".\n k.release(result)\n return []\n }\n k.release(result)\n return out\n } finally {\n k.release(tool)\n }\n },\n splitByPlane: (shape, point, normal) => {\n // Phase 1 probe A: splitter with a planar face tool yields exactly 2 solids.\n const tool = makePlanarFaceTool(k, point, normal)\n try {\n const result = k.split(asShape(shape), [tool])\n if (k.isNull(result)) throw new Error('splitByPlane: splitter produced no result')\n const solids = k.getSubShapes(result, 'solid').map(asHandle)\n k.release(result)\n if (solids.length !== 2) {\n throw new Error(`splitByPlane: expected 2 solids, got ${solids.length}`)\n }\n // Classify sides by centroid projection onto the plane normal.\n const originDot = point.x * normal.x + point.y * normal.y + point.z * normal.z\n const side = (h: BrepHandle): number => {\n const c = k.getCenterOfMass(asShape(h))\n return c.x * normal.x + c.y * normal.y + c.z * normal.z - originDot\n }\n const [a, b] = solids\n return side(a) >= side(b)\n ? { positive: a, negative: b }\n : { positive: b, negative: a }\n } finally {\n k.release(tool)\n }\n },\n\n // ── chamfer & fillet ──\n chamfer: (solid, edgesList, distance) =>\n asHandle(k.chamfer(asShape(solid), shapes(edgesList), distance)),\n chamferDistAngle: (solid, edgesList, distance, angleDeg) =>\n asHandle(k.chamferDistAngle(asShape(solid), shapes(edgesList), distance, angleDeg)),\n fillet: (solid, edgesList, radius) =>\n asHandle(k.fillet(asShape(solid), shapes(edgesList), radius)),\n filletVariable: (solid, edge, startRadius, endRadius) =>\n asHandle(k.filletVariable(asShape(solid), asShape(edge), startRadius, endRadius)),\n filletWithHistory: (solid, edgesList, radius, inputFaceHashes, hashUpperBound) =>\n toEvolution(k.filletWithHistory(asShape(solid), shapes(edgesList), radius, inputFaceHashes, hashUpperBound)),\n\n // ── transforms (matrix convention: 3×4 row-major, 12 doubles) ──\n translate: (shape, dx, dy, dz) => asHandle(k.translate(asShape(shape), dx, dy, dz)),\n scale: (shape, center, factor) => asHandle(k.scale(asShape(shape), center, factor)),\n transform: (shape, matrix) => asHandle(k.transform(asShape(shape), matrix)),\n located: (shape, matrix) => asHandle(k.located(asShape(shape), matrix)),\n locate: (shape, matrix) => asHandle(k.located(asShape(shape), matrix)),\n generalTransform: (shape, matrix) => asHandle(k.generalTransform(asShape(shape), matrix)),\n copy: (shape) => asHandle(k.copy(asShape(shape))),\n copyShape: (shape) => asHandle(k.copy(asShape(shape))),\n composeTransform: (m1, m2) => k.composeTransform(m1, m2),\n mirror: (shape, point, normal) => asHandle(k.mirror(asShape(shape), point, normal)),\n\n // ── patterns ──\n // GOTCHA: occt-wasm native linearPattern/circularPattern return ONE compound\n // handle (their d.ts type lies). Split it into per-replica handles here.\n linearPattern: (shape, direction, spacing, count) => {\n const compound = nativeLinearPattern(asShape(shape), direction, spacing, count)\n return splitCompoundToArray(compound)\n },\n circularPattern: (shape, center, axis, angleStep, count) => {\n // Empirically validated (old adapter + engine-switch-p2 parity): the wasm\n // layer takes the angle in DEGREES here (unlike revolve's angleRad).\n const compound = (k as unknown as OcctPatternRaw).circularPattern.call(\n k, asShape(shape), center, axis, angleStep, count,\n )\n return splitCompoundToArray(compound)\n },\n gridPattern: (shape, directionX, directionY, spacingX, spacingY, countX, countY) => {\n // Composed: native linearPattern along X per column, then along Y per row,\n // fuse all replicas. Must use the CAPTURED native linearPattern (returns\n // compound) — the adapter property above now returns arrays.\n const colCompound = nativeLinearPattern(asShape(shape), directionX, spacingX, countX)\n const cols = k.getSubShapes(colCompound, 'solid')\n k.release(colCompound)\n const all: ShapeHandle[] = []\n try {\n for (const c of cols) {\n const rowCompound = nativeLinearPattern(c, directionY, spacingY, countY)\n try {\n all.push(...k.getSubShapes(rowCompound, 'solid'))\n } finally {\n k.release(rowCompound)\n }\n }\n } finally {\n for (const c of cols) k.release(c)\n }\n return asHandle(k.fuseAll(all))\n },\n\n // ── curve construction ──\n makeLineEdge: (start, end) => asHandle(k.makeLineEdge(start, end)),\n makeArcEdge: (start, mid, end) => asHandle(k.makeArcEdge(start, mid, end)),\n makeBezierEdge: (controlPoints) => asHandle(k.makeBezierEdge(controlPoints)),\n makeBSplineEdge: (poles, weights, knots, multiplicities, degree, periodic) =>\n asHandle(k.makeBSplineEdge(poles, weights, knots, multiplicities, degree, periodic ?? false)),\n makeCircleEdge: (center, normal, radius) =>\n asHandle(k.makeCircleEdge(center, normal, radius)),\n\n // ── topology construction ──\n makeWire: (edgesList) => asHandle(k.makeWire(shapes(edgesList))),\n makeFace: (wire) => asHandle(k.makeFace(asShape(wire))),\n makeCompound: (list) => asHandle(k.makeCompound(shapes(list))),\n addHolesInFace: (face, holeWires) =>\n asHandle(k.addHolesInFace(asShape(face), shapes(holeWires))),\n buildTriFace: (a, b, c) => asHandle(k.buildTriFace(a, b, c)),\n\n // ── tessellation (the only BREP→mesh exit) ──\n meshShape: (shape, options): BrepMeshResult => {\n const m: Mesh = k.meshShape(asShape(shape), options)\n return {\n positions: m.positions,\n normals: m.normals,\n indices: m.indices,\n vertexCount: m.vertexCount,\n triangleCount: m.triangleCount,\n faceGroups: m.faceGroups,\n faceCount: m.faceCount,\n }\n },\n wireframe: (shape, deflection): BrepEdgeData => {\n const e: EdgeData = k.wireframe(asShape(shape), deflection)\n return {\n points: e.points,\n edgeGroups: e.edgeGroups,\n pointCount: e.pointCount,\n edgeCount: e.edgeCount,\n }\n },\n\n // ── topology queries ──\n getSubShapes: (shape, type) => k.getSubShapes(asShape(shape), type).map(asHandle),\n subShapeHashes: (shape, type, hashUpperBound) =>\n k.subShapeHashes(asShape(shape), type, hashUpperBound),\n hashCode: (shape, upperBound) => k.hashCode(asShape(shape), upperBound),\n isSame: (a, b) => k.isSame(asShape(a), asShape(b)),\n isSolid: (shape) => k.isSolid(asShape(shape)),\n shapeType: (shape) => k.getShapeType(asShape(shape)),\n shapeOrientation: (shape) => String(k.shapeOrientation(asShape(shape))),\n edgeToFaceMap: (shape) => k.edgeToFaceMap(asShape(shape), HASH_UPPER_BOUND),\n adjacentFaces: (shape, face) =>\n k.adjacentFaces(asShape(shape), asShape(face)).map(asHandle),\n sharedEdges: (a, b) => k.sharedEdges(asShape(a), asShape(b)).map(asHandle),\n\n // ── geometry evaluation ──\n curveType: (edge) => String(k.curveType(asShape(edge))),\n curvePointAtParam: (edge, param) => v3(k.curvePointAtParam(asShape(edge), param)),\n curveTangent: (edge, param) => v3(k.curveTangent(asShape(edge), param)),\n curveParameters: (edge): BrepCurveParameters => k.curveParameters(asShape(edge)),\n curveIsClosed: (edge) => k.curveIsClosed(asShape(edge)),\n curveLength: (edge) => k.curveLength(asShape(edge)),\n surfaceType: (face) => String(k.surfaceType(asShape(face))),\n surfaceNormal: (face, u, vv) => v3(k.surfaceNormal(asShape(face), u, vv)),\n pointOnSurface: (face, u, vv) => v3(k.pointOnSurface(asShape(face), u, vv)),\n uvBounds: (face): BrepUvBounds => k.uvBounds(asShape(face)),\n surfaceCenterOfMass: (face) => v3(k.getSurfaceCenterOfMass(asShape(face))),\n getFaceCylinderData: (face) => {\n const d = k.getFaceCylinderData(asShape(face))\n return d ? { radius: d.radius } : null\n },\n getNurbsCurveData: (edge) => {\n const d = k.getNurbsCurveData(asShape(edge))\n return d\n ? {\n degree: d.degree,\n rational: d.rational,\n periodic: d.periodic,\n knots: Array.from(d.knots),\n multiplicities: Array.from(d.multiplicities),\n poles: Array.from(d.poles),\n weights: Array.from(d.weights),\n }\n : null\n },\n curveSplit: (edge, param) => {\n const parts = k.curveSplit(asShape(edge), param)\n return [asHandle(parts[0]), asHandle(parts[1])]\n },\n interpolatePoints: (points, degree) => {\n // L1 contract takes an explicit degree; occt-wasm interpolates a cubic\n // (or periodic) spline and ignores degree — honor only degree 3 and\n // reject others loudly rather than silently producing wrong geometry.\n if (degree !== 3) {\n throw new Error(`occt interpolatePoints: only degree 3 supported, got ${degree}`)\n }\n return asHandle(k.interpolatePoints(points))\n },\n\n defeature: (shape, facesList) => asHandle(k.defeature(asShape(shape), shapes(facesList), 0)),\n draft: (shape, facesList, pull, neutral, angleDeg) => {\n // Native draft is single-face + radians, and has NO neutral-plane argument\n // (occt-wasm index.d.ts:156 `draft(shape, face, angleRad, direction)`).\n // Silently dropping a caller-supplied neutral plane would draft against the\n // wrong plane, so reject loudly (same rule as `interpolatePoints` below).\n // brepkit's L1 draft does consume the neutral point (brepkitKernel.ts:669).\n if (neutral && (neutral.x !== 0 || neutral.y !== 0 || neutral.z !== 0)) {\n throw new Error(\n 'occt draft: neutral plane is not supported by the native kernel ' +\n `(got neutral=(${neutral.x},${neutral.y},${neutral.z})); only the origin neutral is representable`,\n )\n }\n // Native draft is single-face; fold N faces sequentially.\n let current = asShape(shape)\n for (const f of facesList) {\n current = k.draft(current, asShape(f), rad(angleDeg), pull)\n }\n return asHandle(current)\n },\n removeHolesFromFace: (face) => {\n // Native takes hole indices; removing ALL holes = all wires except outer.\n const wires = k.getSubShapes(asShape(face), 'wire')\n const indices = wires.map((_, i) => i).filter((i) => i > 0)\n return asHandle(k.removeHolesFromFace(asShape(face), indices))\n },\n reverseShape: (shape) => asHandle(k.reverseShape(asShape(shape))),\n projectEdges: (shape, origin, direction, xAxis, _hiddenLines, _deflection) =>\n // Native projection has no hiddenLines/deflection flags in its signature —\n // pass through the projection result; callers treat it as opaque (unknown).\n k.projectEdges(asShape(shape), origin, direction, xAxis),\n\n // ── measurement ──\n getBoundingBox: (shape, useTriangulation): BrepBoundingBox =>\n k.getBoundingBox(asShape(shape), useTriangulation),\n getVolume: (shape) => k.getVolume(asShape(shape)),\n getCenterOfMass: (shape) => v3(k.getCenterOfMass(asShape(shape))),\n getSurfaceArea: (shape) => k.getSurfaceArea(asShape(shape)),\n // getLength:唯一 edge 弧长之和(与 brepkit 适配器同口径,D5)。\n // OCC 原生 LinearProperties 默认 SkipShared=false,按**面**遍历、把每条共享边按\n // 相邻面各计一次 ⇒ 实体得到的是「Σ 面周长」而非弧长(20×10×5 盒 → 280 = 2×140)。\n // 归一化为 TopExp 去重后的边逐条求和。checkpoint/releaseSince 是 occt-wasm 为\n // 「枚举子形状句柄后批量回收」提供的 arena 机制(index.d.ts:274-279, 498-511);\n // h 在 checkpoint 之前产生,不会被回收。\n getLength: (shape) => {\n const h = asShape(shape)\n const mark = k.checkpoint()\n try {\n let total = 0\n for (const e of k.getSubShapes(h, 'edge')) total += k.getLength(e)\n return total\n } finally {\n k.releaseSince(mark)\n }\n },\n\n // ── validation & repair ──\n isValid: (shape) => k.isValid(asShape(shape)),\n unifySameDomain: (shape) => asHandle(k.unifySameDomain(asShape(shape))),\n healSolid: (shape, tolerance) => asHandle(k.healSolid(asShape(shape), tolerance)),\n fixShape: (shape) => asHandle(k.fixShape(asShape(shape))),\n fixFaceOrientations: (shape) => asHandle(k.fixFaceOrientations(asShape(shape))),\n removeDegenerateEdges: (shape, _tolerance) =>\n // Native takes no tolerance parameter (kernel-fixed tolerance).\n asHandle(k.removeDegenerateEdges(asShape(shape))),\n\n // ── IO ──\n importStep: (data) => asHandle(k.importStep(data)),\n exportStep: (shape) => k.exportStep(asShape(shape)),\n importStl: (data) => asHandle(k.importStl(data)),\n fromBREP: (data) => asHandle(k.fromBREP(data)),\n\n // ── face evolution (L1 trio only) ──\n cutWithHistory: (a, b, inputFaceHashes, hashUpperBound) =>\n toEvolution(k.cutWithHistory(asShape(a), asShape(b), inputFaceHashes, hashUpperBound)),\n fuseWithHistory: (a, b, inputFaceHashes, hashUpperBound) =>\n toEvolution(k.fuseWithHistory(asShape(a), asShape(b), inputFaceHashes, hashUpperBound)),\n intersectWithHistory: (a, b, inputFaceHashes, hashUpperBound) =>\n toEvolution(k.intersectWithHistory(asShape(a), asShape(b), inputFaceHashes, hashUpperBound)),\n }\n\n return primitives\n}\n\n/** The occt primitives type (BrepEngineApi implementation). */\nexport type OcctPrimitives = Awaited<ReturnType<typeof createOcctPrimitives>>\n\n// §7.8 compile-time guard: the explicit literal must satisfy the L1 contract\n// member-by-member (this now has real verification power — no `as` escape).\n/** Compile-time assertion that OcctPrimitives satisfies BrepEngineApi. */\nexport type _AssertOcctApi = AssertSatisfiesBrepEngineApi<OcctPrimitives>"]}
1
+ {"version":3,"file":"occt-primitives.js","sourceRoot":"","sources":["../../src/occt-kernel/occt-primitives.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * occt-kernel/occt-primitives — `createOcctPrimitives()`: the L1 contract\n * (`BrepEngineApi`) adapter over the raw occt-wasm `OcctKernel` singleton.\n *\n * Plan Phase 3.2:\n * explicit object literal, one method per L1 contract member — no monkey\n * patching, no cross-layer assertion lies, no unsupported() stubs. Every member\n * here is either a direct pass-through to the native kernel or an adapter-side\n * dialect digestion, both honestly implementing the contract.\n *\n * Occt-only capabilities (loft family, tool-entity section/split, *WithHistory\n * beyond the L1 trio, XCAF, SVG projection …) are deliberately NOT here —\n * platform code reaches them through the native face: `getOcctKernel()` (D3).\n */\nimport type {\n EdgeData,\n EvolutionData,\n Mesh,\n OcctKernel,\n ShapeHandle,\n Vec3,\n} from 'occt-wasm'\nimport { initOcctWasm } from './occtKernel'\nimport { hullFromPoints as hullFromPointsCore } from './hullOps'\nimport type { AssertSatisfiesBrepEngineApi, BrepEngineApi } from '../brep/engine/primitives'\nimport type {\n BrepBoundingBox,\n BrepCurveParameters,\n BrepEdgeData,\n BrepEvolutionData,\n BrepHandle,\n BrepMeshResult,\n BrepUvBounds,\n BrepVec3,\n} from '../brep/engine/types'\n\nconst asHandle = (h: number | ShapeHandle): BrepHandle => h as BrepHandle\nconst asShape = (h: BrepHandle): ShapeHandle => h as unknown as ShapeHandle\nconst shapes = (hs: BrepHandle[]): ShapeHandle[] => hs.map(asShape)\nconst v3 = (v: Vec3): BrepVec3 => ({ x: v.x, y: v.y, z: v.z })\nconst rad = (deg: number): number => (deg * Math.PI) / 180\n\n/** Topology layer uses this upper bound for face hashes (HASH_CODE_MAX). */\nconst HASH_UPPER_BOUND = 2 ** 24\n\n/** occt-wasm native linearPattern/circularPattern return ONE compound handle\n * containing all replicas (the wasm d.ts type lies by claiming a plain handle).\n * The adapter captures the native methods, then splits the compound via\n * getSubShapes('solid') into the BrepHandle[] the L1 contract promises. */\ntype OcctPatternRaw = {\n linearPattern(shape: ShapeHandle, direction: Vec3, spacing: number, count: number): ShapeHandle\n circularPattern(shape: ShapeHandle, center: Vec3, axis: Vec3, angle: number, count: number): ShapeHandle\n}\n\n/**\n * Build a large planar face (boolean tool) through `point`, oriented by\n * `normal`. The face is constructed directly in the plane's own basis\n * (u ⊥ v ⊥ normal, through point) — no post-rotation needed, any normal\n * direction works (the Phase 1 probe only pinned +Z; this generalizes it).\n */\nfunction makePlanarFaceTool(k: OcctKernel, point: BrepVec3, normal: BrepVec3): ShapeHandle {\n const size = 500 // large enough to fully cut any reasonable solid\n // Pick the axis component with the smallest magnitude to build a stable\n // perpendicular basis (avoids degeneracy when normal is axis-aligned).\n const ax = Math.abs(normal.x)\n const ay = Math.abs(normal.y)\n const az = Math.abs(normal.z)\n let u: BrepVec3\n if (ax <= ay && ax <= az) u = { x: 0, y: -normal.z, z: normal.y }\n else if (ay <= az) u = { x: -normal.z, y: 0, z: normal.x }\n else u = { x: normal.y, y: -normal.x, z: 0 }\n const ul = Math.hypot(u.x, u.y, u.z)\n u = { x: u.x / ul, y: u.y / ul, z: u.z / ul }\n const v: BrepVec3 = {\n x: normal.y * u.z - normal.z * u.y,\n y: normal.z * u.x - normal.x * u.z,\n z: normal.x * u.y - normal.y * u.x,\n }\n const corner = (a: number, b: number): Vec3 => ({\n x: point.x + (u.x * a + v.x * b) * size,\n y: point.y + (u.y * a + v.y * b) * size,\n z: point.z + (u.z * a + v.z * b) * size,\n })\n const e1 = k.makeLineEdge(corner(-1, -1), corner(1, -1))\n const e2 = k.makeLineEdge(corner(1, -1), corner(1, 1))\n const e3 = k.makeLineEdge(corner(1, 1), corner(-1, 1))\n const e4 = k.makeLineEdge(corner(-1, 1), corner(-1, -1))\n const wire = k.makeWire([e1, e2, e3, e4])\n const face = k.makeFace(wire)\n k.release(wire)\n return face\n}\n\n/**\n * Create the occt implementation of the L1 engine contract. Idempotent-friendly:\n * the wasm kernel is a process-level singleton (see initOcctWasm), each call\n * returns a fresh adapter object over the same kernel.\n *\n * @returns a BrepEngineApi implementation backed by the occt wasm kernel.\n */\nexport async function createOcctPrimitives(): Promise<BrepEngineApi> {\n const k = await initOcctWasm()\n const raw = k as unknown as OcctPatternRaw\n // Capture native pattern methods BEFORE any wiring so gridPattern composes\n // on true native semantics (old adapter GOTCHA: after overwriting, calling\n // the property again recurses into the wrapper).\n const nativeLinearPattern = raw.linearPattern.bind(k)\n // 2026-09-25 core-decouple Phase 2(§5.1):hull 最小闭包已移植进 occt-kernel/\n // (hullGeometry + hullOps,occt-wasm 原生直调),此处不再经\n // OcctWasmAdapter——core 自有引擎对旧适配器的最后一处依赖已拔除。\n\n const splitCompoundToArray = (compound: ShapeHandle): BrepHandle[] => {\n const parts = k.getSubShapes(compound, 'solid').map(asHandle)\n k.release(compound)\n return parts\n }\n\n const toEvolution = (e: EvolutionData): BrepEvolutionData => ({\n // occt-wasm's EvolutionData already carries the segmented\n // [inHash, count, outHash…] encoding pinned by phase0-kernel-probes\n // (its own docs claim flat maps — docs are wrong, data is segmented).\n result: asHandle(e.result),\n modified: e.modified,\n generated: e.generated,\n deleted: e.deleted,\n })\n\n const primitives: BrepEngineApi = {\n // ── lifecycle ──\n release: (shape) => k.release(asShape(shape)),\n dispose: (shape) => {\n if (shape !== undefined) k.release(asShape(shape))\n },\n\n // ── solids ──\n makeBox: (dx, dy, dz) => asHandle(k.makeBox(dx, dy, dz)),\n makeBoxFromCorners: (c1, c2) => asHandle(k.makeBoxFromCorners(c1, c2)),\n makeCylinder: (radius, height) => asHandle(k.makeCylinder(radius, height)),\n makeSphere: (radius) => asHandle(k.makeSphere(radius)),\n makeCone: (r1, r2, height) => asHandle(k.makeCone(r1, r2, height)),\n makeRectangle: (w, h) => asHandle(k.makeRectangle(w, h)),\n makeEllipsoid: (rx, ry, rz) => asHandle(k.makeEllipsoid(rx, ry, rz)),\n makeTorus: (major, minor) => asHandle(k.makeTorus(major, minor)),\n makeVertex: (x, y, z) => asHandle(k.makeVertex(x, y, z)),\n\n // ── shaping ──\n extrude: (shape, dx, dy, dz) => asHandle(k.extrude(asShape(shape), dx, dy, dz)),\n revolveVec: (shape, center, direction, angleDeg) =>\n asHandle(k.revolve(asShape(shape), { point: center, direction }, rad(angleDeg))),\n sew: (list, tolerance) => asHandle(k.sew(shapes(list), tolerance)),\n sewAndSolidify: (faces, tolerance) => asHandle(k.sewAndSolidify(shapes(faces), tolerance)),\n shell: (solid, facesToRemove, thickness, tolerance) =>\n asHandle(k.shell(asShape(solid), shapes(facesToRemove), thickness, tolerance)),\n hullFromPoints: (points, tolerance) => hullFromPointsCore(k, points as never, tolerance),\n\n // ── booleans & splitting ──\n fuse: (a, b) => asHandle(k.fuse(asShape(a), asShape(b))),\n cut: (a, b) => asHandle(k.cut(asShape(a), asShape(b))),\n common: (a, b) => asHandle(k.common(asShape(a), asShape(b))),\n intersect: (a, b) => asHandle(k.intersect(asShape(a), asShape(b))),\n fuseAll: (list) => asHandle(k.fuseAll(shapes(list))),\n sectionByPlane: (shape, point, normal) => {\n // Phase 1 probe A (phase1-semantic-probes.test.ts): a planar face used as\n // the section tool yields the plane-section geometry. Downcast the result\n // compound into edge/wire handles; a non-compound result passes through.\n const tool = makePlanarFaceTool(k, point, normal)\n try {\n const result = k.section(asShape(shape), tool)\n if (k.isNull(result)) return []\n const out: BrepHandle[] = []\n for (const t of ['edge', 'wire'] as const) {\n for (const part of k.getSubShapes(result, t)) out.push(asHandle(k.downcast(part, t)))\n }\n if (out.length === 0) {\n // No intersection: native section still yields an (empty) compound —\n // release it and return an empty list so callers can detect the miss\n // instead of adopting an empty compound as a \"curve\".\n k.release(result)\n return []\n }\n k.release(result)\n return out\n } finally {\n k.release(tool)\n }\n },\n splitByPlane: (shape, point, normal) => {\n // Phase 1 probe A: splitter with a planar face tool yields exactly 2 solids.\n const tool = makePlanarFaceTool(k, point, normal)\n try {\n const result = k.split(asShape(shape), [tool])\n if (k.isNull(result)) throw new Error('splitByPlane: splitter produced no result')\n const solids = k.getSubShapes(result, 'solid').map(asHandle)\n k.release(result)\n if (solids.length !== 2) {\n throw new Error(`splitByPlane: expected 2 solids, got ${solids.length}`)\n }\n // Classify sides by centroid projection onto the plane normal.\n const originDot = point.x * normal.x + point.y * normal.y + point.z * normal.z\n const side = (h: BrepHandle): number => {\n const c = k.getCenterOfMass(asShape(h))\n return c.x * normal.x + c.y * normal.y + c.z * normal.z - originDot\n }\n const [a, b] = solids\n return side(a) >= side(b)\n ? { positive: a, negative: b }\n : { positive: b, negative: a }\n } finally {\n k.release(tool)\n }\n },\n\n // ── chamfer & fillet ──\n chamfer: (solid, edgesList, distance) =>\n asHandle(k.chamfer(asShape(solid), shapes(edgesList), distance)),\n chamferDistAngle: (solid, edgesList, distance, angleDeg) =>\n asHandle(k.chamferDistAngle(asShape(solid), shapes(edgesList), distance, angleDeg)),\n fillet: (solid, edgesList, radius) =>\n asHandle(k.fillet(asShape(solid), shapes(edgesList), radius)),\n filletVariable: (solid, edge, startRadius, endRadius) =>\n asHandle(k.filletVariable(asShape(solid), asShape(edge), startRadius, endRadius)),\n filletWithHistory: (solid, edgesList, radius, inputFaceHashes, hashUpperBound) =>\n toEvolution(k.filletWithHistory(asShape(solid), shapes(edgesList), radius, inputFaceHashes, hashUpperBound)),\n\n // ── transforms (matrix convention: 3×4 row-major, 12 doubles) ──\n translate: (shape, dx, dy, dz) => asHandle(k.translate(asShape(shape), dx, dy, dz)),\n scale: (shape, center, factor) => asHandle(k.scale(asShape(shape), center, factor)),\n transform: (shape, matrix) => asHandle(k.transform(asShape(shape), matrix)),\n located: (shape, matrix) => asHandle(k.located(asShape(shape), matrix)),\n locate: (shape, matrix) => asHandle(k.located(asShape(shape), matrix)),\n generalTransform: (shape, matrix) => {\n // GOTCHA (2026-10-07, openscad example023 parity): the native `gp_GTrsf`\n // path returns a handle whose *stored triangulation* double-applies the\n // translated face's TopLoc. The exact geometry is right; only the\n // tessellation is wrong, so the defect only shows on an **already meshed**\n // shape — and every `cad.extrude`/boolean result is meshed for display\n // (`brep-ops.ts#solidToShape`). Measured on an extruded face-with-hole\n // prism: exact top cap 5.0, tessellated top cap 10.0 (non-uniform z×2.5:\n // 12.5 vs 17.5). `BRepBuilderAPI_Copy` yields a shape without the stale\n // triangulation, so the result re-tessellates correctly.\n //\n // Deliberately adapter-local, not in the engine-neutral dispatcher\n // (`brep/brep-ops.ts#applyAffineBrep`): the defect is **occt-only** —\n // brepkit's GTrsf path is clean (pinned by\n // test/brep/applymatrix-similarity-routing.test.ts). Making every engine\n // pay an extra handle allocation for an occt quirk also perturbed\n // brepkit's `cut` bbox in test/brep/engine/multi-engine-op-parity.test.ts.\n //\n // Safety: the copy is adapter-owned and released here; the returned handle\n // is independent of it (the native op does not consume its input).\n const copy = k.copy(asShape(shape))\n try {\n return asHandle(k.generalTransform(copy, matrix))\n } finally {\n k.release(copy)\n }\n },\n copy: (shape) => asHandle(k.copy(asShape(shape))),\n copyShape: (shape) => asHandle(k.copy(asShape(shape))),\n composeTransform: (m1, m2) => k.composeTransform(m1, m2),\n mirror: (shape, point, normal) => asHandle(k.mirror(asShape(shape), point, normal)),\n\n // ── patterns ──\n // GOTCHA: occt-wasm native linearPattern/circularPattern return ONE compound\n // handle (their d.ts type lies). Split it into per-replica handles here.\n linearPattern: (shape, direction, spacing, count) => {\n const compound = nativeLinearPattern(asShape(shape), direction, spacing, count)\n return splitCompoundToArray(compound)\n },\n circularPattern: (shape, center, axis, angleStep, count) => {\n // Empirically validated (old adapter + engine-switch-p2 parity): the wasm\n // layer takes the angle in DEGREES here (unlike revolve's angleRad).\n const compound = (k as unknown as OcctPatternRaw).circularPattern.call(\n k, asShape(shape), center, axis, angleStep, count,\n )\n return splitCompoundToArray(compound)\n },\n gridPattern: (shape, directionX, directionY, spacingX, spacingY, countX, countY) => {\n // Composed: native linearPattern along X per column, then along Y per row,\n // fuse all replicas. Must use the CAPTURED native linearPattern (returns\n // compound) — the adapter property above now returns arrays.\n const colCompound = nativeLinearPattern(asShape(shape), directionX, spacingX, countX)\n const cols = k.getSubShapes(colCompound, 'solid')\n k.release(colCompound)\n const all: ShapeHandle[] = []\n try {\n for (const c of cols) {\n const rowCompound = nativeLinearPattern(c, directionY, spacingY, countY)\n try {\n all.push(...k.getSubShapes(rowCompound, 'solid'))\n } finally {\n k.release(rowCompound)\n }\n }\n } finally {\n for (const c of cols) k.release(c)\n }\n return asHandle(k.fuseAll(all))\n },\n\n // ── curve construction ──\n makeLineEdge: (start, end) => asHandle(k.makeLineEdge(start, end)),\n makeArcEdge: (start, mid, end) => asHandle(k.makeArcEdge(start, mid, end)),\n makeBezierEdge: (controlPoints) => asHandle(k.makeBezierEdge(controlPoints)),\n makeBSplineEdge: (poles, weights, knots, multiplicities, degree, periodic) =>\n asHandle(k.makeBSplineEdge(poles, weights, knots, multiplicities, degree, periodic ?? false)),\n makeCircleEdge: (center, normal, radius) =>\n asHandle(k.makeCircleEdge(center, normal, radius)),\n\n // ── topology construction ──\n makeWire: (edgesList) => asHandle(k.makeWire(shapes(edgesList))),\n makeFace: (wire) => asHandle(k.makeFace(asShape(wire))),\n makeCompound: (list) => asHandle(k.makeCompound(shapes(list))),\n addHolesInFace: (face, holeWires) =>\n asHandle(k.addHolesInFace(asShape(face), shapes(holeWires))),\n buildTriFace: (a, b, c) => asHandle(k.buildTriFace(a, b, c)),\n\n // ── tessellation (the only BREP→mesh exit) ──\n meshShape: (shape, options): BrepMeshResult => {\n const m: Mesh = k.meshShape(asShape(shape), options)\n return {\n positions: m.positions,\n normals: m.normals,\n indices: m.indices,\n vertexCount: m.vertexCount,\n triangleCount: m.triangleCount,\n faceGroups: m.faceGroups,\n faceCount: m.faceCount,\n }\n },\n wireframe: (shape, deflection): BrepEdgeData => {\n const e: EdgeData = k.wireframe(asShape(shape), deflection)\n return {\n points: e.points,\n edgeGroups: e.edgeGroups,\n pointCount: e.pointCount,\n edgeCount: e.edgeCount,\n }\n },\n\n // ── topology queries ──\n getSubShapes: (shape, type) => k.getSubShapes(asShape(shape), type).map(asHandle),\n subShapeHashes: (shape, type, hashUpperBound) =>\n k.subShapeHashes(asShape(shape), type, hashUpperBound),\n hashCode: (shape, upperBound) => k.hashCode(asShape(shape), upperBound),\n isSame: (a, b) => k.isSame(asShape(a), asShape(b)),\n isSolid: (shape) => k.isSolid(asShape(shape)),\n shapeType: (shape) => k.getShapeType(asShape(shape)),\n shapeOrientation: (shape) => String(k.shapeOrientation(asShape(shape))),\n edgeToFaceMap: (shape) => k.edgeToFaceMap(asShape(shape), HASH_UPPER_BOUND),\n adjacentFaces: (shape, face) =>\n k.adjacentFaces(asShape(shape), asShape(face)).map(asHandle),\n sharedEdges: (a, b) => k.sharedEdges(asShape(a), asShape(b)).map(asHandle),\n\n // ── geometry evaluation ──\n curveType: (edge) => String(k.curveType(asShape(edge))),\n curvePointAtParam: (edge, param) => v3(k.curvePointAtParam(asShape(edge), param)),\n curveTangent: (edge, param) => v3(k.curveTangent(asShape(edge), param)),\n curveParameters: (edge): BrepCurveParameters => k.curveParameters(asShape(edge)),\n curveIsClosed: (edge) => k.curveIsClosed(asShape(edge)),\n curveLength: (edge) => k.curveLength(asShape(edge)),\n surfaceType: (face) => String(k.surfaceType(asShape(face))),\n surfaceNormal: (face, u, vv) => v3(k.surfaceNormal(asShape(face), u, vv)),\n pointOnSurface: (face, u, vv) => v3(k.pointOnSurface(asShape(face), u, vv)),\n uvBounds: (face): BrepUvBounds => k.uvBounds(asShape(face)),\n surfaceCenterOfMass: (face) => v3(k.getSurfaceCenterOfMass(asShape(face))),\n getFaceCylinderData: (face) => {\n const d = k.getFaceCylinderData(asShape(face))\n return d ? { radius: d.radius } : null\n },\n getNurbsCurveData: (edge) => {\n const d = k.getNurbsCurveData(asShape(edge))\n return d\n ? {\n degree: d.degree,\n rational: d.rational,\n periodic: d.periodic,\n knots: Array.from(d.knots),\n multiplicities: Array.from(d.multiplicities),\n poles: Array.from(d.poles),\n weights: Array.from(d.weights),\n }\n : null\n },\n curveSplit: (edge, param) => {\n const parts = k.curveSplit(asShape(edge), param)\n return [asHandle(parts[0]), asHandle(parts[1])]\n },\n interpolatePoints: (points, degree) => {\n // L1 contract takes an explicit degree; occt-wasm interpolates a cubic\n // (or periodic) spline and ignores degree — honor only degree 3 and\n // reject others loudly rather than silently producing wrong geometry.\n if (degree !== 3) {\n throw new Error(`occt interpolatePoints: only degree 3 supported, got ${degree}`)\n }\n return asHandle(k.interpolatePoints(points))\n },\n\n defeature: (shape, facesList) => asHandle(k.defeature(asShape(shape), shapes(facesList), 0)),\n draft: (shape, facesList, pull, neutral, angleDeg) => {\n // Native draft is single-face + radians, and has NO neutral-plane argument\n // (occt-wasm index.d.ts:156 `draft(shape, face, angleRad, direction)`).\n // Silently dropping a caller-supplied neutral plane would draft against the\n // wrong plane, so reject loudly (same rule as `interpolatePoints` below).\n // brepkit's L1 draft does consume the neutral point (brepkitKernel.ts:669).\n if (neutral && (neutral.x !== 0 || neutral.y !== 0 || neutral.z !== 0)) {\n throw new Error(\n 'occt draft: neutral plane is not supported by the native kernel ' +\n `(got neutral=(${neutral.x},${neutral.y},${neutral.z})); only the origin neutral is representable`,\n )\n }\n // Native draft is single-face; fold N faces sequentially.\n let current = asShape(shape)\n for (const f of facesList) {\n current = k.draft(current, asShape(f), rad(angleDeg), pull)\n }\n return asHandle(current)\n },\n removeHolesFromFace: (face) => {\n // Native takes hole indices; removing ALL holes = all wires except outer.\n const wires = k.getSubShapes(asShape(face), 'wire')\n const indices = wires.map((_, i) => i).filter((i) => i > 0)\n return asHandle(k.removeHolesFromFace(asShape(face), indices))\n },\n reverseShape: (shape) => asHandle(k.reverseShape(asShape(shape))),\n projectEdges: (shape, origin, direction, xAxis, _hiddenLines, _deflection) =>\n // Native projection has no hiddenLines/deflection flags in its signature —\n // pass through the projection result; callers treat it as opaque (unknown).\n k.projectEdges(asShape(shape), origin, direction, xAxis),\n\n // ── measurement ──\n getBoundingBox: (shape, useTriangulation): BrepBoundingBox =>\n k.getBoundingBox(asShape(shape), useTriangulation ?? false),\n getVolume: (shape) => k.getVolume(asShape(shape)),\n getCenterOfMass: (shape) => v3(k.getCenterOfMass(asShape(shape))),\n getSurfaceArea: (shape) => k.getSurfaceArea(asShape(shape)),\n // getLength:唯一 edge 弧长之和(与 brepkit 适配器同口径,D5)。\n // OCC 原生 LinearProperties 默认 SkipShared=false,按**面**遍历、把每条共享边按\n // 相邻面各计一次 ⇒ 实体得到的是「Σ 面周长」而非弧长(20×10×5 盒 → 280 = 2×140)。\n // 归一化为 TopExp 去重后的边逐条求和。checkpoint/releaseSince 是 occt-wasm 为\n // 「枚举子形状句柄后批量回收」提供的 arena 机制(index.d.ts:274-279, 498-511);\n // h 在 checkpoint 之前产生,不会被回收。\n getLength: (shape) => {\n const h = asShape(shape)\n const mark = k.checkpoint()\n try {\n let total = 0\n for (const e of k.getSubShapes(h, 'edge')) total += k.getLength(e)\n return total\n } finally {\n k.releaseSince(mark)\n }\n },\n\n // ── validation & repair ──\n isValid: (shape) => k.isValid(asShape(shape)),\n unifySameDomain: (shape) => asHandle(k.unifySameDomain(asShape(shape))),\n healSolid: (shape, tolerance) => asHandle(k.healSolid(asShape(shape), tolerance)),\n fixShape: (shape) => asHandle(k.fixShape(asShape(shape))),\n fixFaceOrientations: (shape) => asHandle(k.fixFaceOrientations(asShape(shape))),\n removeDegenerateEdges: (shape, _tolerance) =>\n // Native takes no tolerance parameter (kernel-fixed tolerance).\n asHandle(k.removeDegenerateEdges(asShape(shape))),\n\n // ── IO ──\n importStep: (data) => asHandle(k.importStep(data)),\n exportStep: (shape) => k.exportStep(asShape(shape)),\n importStl: (data) => asHandle(k.importStl(data)),\n fromBREP: (data) => asHandle(k.fromBREP(data)),\n\n // ── face evolution (L1 trio only) ──\n cutWithHistory: (a, b, inputFaceHashes, hashUpperBound) =>\n toEvolution(k.cutWithHistory(asShape(a), asShape(b), inputFaceHashes, hashUpperBound)),\n fuseWithHistory: (a, b, inputFaceHashes, hashUpperBound) =>\n toEvolution(k.fuseWithHistory(asShape(a), asShape(b), inputFaceHashes, hashUpperBound)),\n intersectWithHistory: (a, b, inputFaceHashes, hashUpperBound) =>\n toEvolution(k.intersectWithHistory(asShape(a), asShape(b), inputFaceHashes, hashUpperBound)),\n }\n\n return primitives\n}\n\n/** The occt primitives type (BrepEngineApi implementation). */\nexport type OcctPrimitives = Awaited<ReturnType<typeof createOcctPrimitives>>\n\n// §7.8 compile-time guard: the explicit literal must satisfy the L1 contract\n// member-by-member (this now has real verification power — no `as` escape).\n/** Compile-time assertion that OcctPrimitives satisfies BrepEngineApi. */\nexport type _AssertOcctApi = AssertSatisfiesBrepEngineApi<OcctPrimitives>"]}
@@ -36,7 +36,7 @@ export declare function setOcctWasmInitFn(fn: (() => Promise<OcctKernel>) | null
36
36
  /**
37
37
  * Resolve the occt-wasm WASM file path (linker-agnostic).
38
38
  *
39
- * Walks the package exports (occt-wasm@3.8.4 exports "./dist/occt-wasm.wasm"),
39
+ * Walks the package exports (occt-wasm@5.6.0 exports "./dist/occt-wasm.wasm"),
40
40
  * independent of cwd / hoisting / pnpm|npm linker (verified pattern C).
41
41
  * Replaces the old 4-level `..` path guessing + process.cwd() fallback.
42
42
  *
@@ -1 +1 @@
1
- {"version":3,"file":"occtKernel.d.ts","sourceRoot":"","sources":["../../src/occt-kernel/occtKernel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"occtKernel.d.ts","sourceRoot":"","sources":["../../src/occt-kernel/occtKernel.ts"],"names":[],"mappings":"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"}
@@ -67,7 +67,7 @@ export function setOcctWasmInitFn(fn) {
67
67
  /**
68
68
  * Resolve the occt-wasm WASM file path (linker-agnostic).
69
69
  *
70
- * Walks the package exports (occt-wasm@3.8.4 exports "./dist/occt-wasm.wasm"),
70
+ * Walks the package exports (occt-wasm@5.6.0 exports "./dist/occt-wasm.wasm"),
71
71
  * independent of cwd / hoisting / pnpm|npm linker (verified pattern C).
72
72
  * Replaces the old 4-level `..` path guessing + process.cwd() fallback.
73
73
  *
@@ -228,12 +228,30 @@ export async function importAssemblyFromStep(stepData) {
228
228
  for (let i = 0; i < rootTags.length; i++) {
229
229
  nodes.push(walkLabel(kernel, doc, rootTags[i], `o${i}`, solidColors, cursor));
230
230
  }
231
+ // P2 修复(2026-10-06):文档关闭前把全部 leaf shapeHandle 提升为独立副本。
232
+ // getLabelInfo 返回的句柄生命周期绑定 XCAF 文档(doc.close() 释放文档资源),
233
+ // 直接返回会让调用方拿到悬空句柄——BOP(common/cut 等)在 worker 环境内存
234
+ // 复用后访问悬空句柄挂死(node 内存不复用侥幸通过;e2e/worker 必现)。
235
+ // BRepBuilderAPI_Copy 深拷贝独立于文档,release 原句柄后副本生命周期由调用方
236
+ // 掌控(releaseAssemblyTree / 各消费方的 release 路径)。
237
+ for (const n of nodes)
238
+ liftShapesFromDocument(kernel, n);
231
239
  return nodes;
232
240
  }
233
241
  finally {
234
242
  doc.close();
235
243
  }
236
244
  }
245
+ /** 递归把节点树中所有 leaf shapeHandle 从文档句柄提升为独立副本(P2,2026-10-06)。 */
246
+ function liftShapesFromDocument(kernel, node) {
247
+ if (node.shapeHandle) {
248
+ const copied = kernel.copy(node.shapeHandle);
249
+ kernel.release(node.shapeHandle);
250
+ node.shapeHandle = copied;
251
+ }
252
+ for (const child of node.children)
253
+ liftShapesFromDocument(kernel, child);
254
+ }
237
255
  function walkLabel(kernel, doc, tag, path, solidColors, ctx) {
238
256
  const info = doc.getLabelInfo(tag);
239
257
  const name = info.name || path;
@@ -1 +1 @@
1
- {"version":3,"file":"occtKernel.js","sourceRoot":"","sources":["../../src/occt-kernel/occtKernel.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * occt-wasm 封装层 — 替代 occt-import-js\n *\n * 提供 STEP/BREP → Mesh 转换和 Mesh → STEP 导出能力。\n * 利用 occt-wasm 的 meshShape() 获取 faceGroups(面→三角形映射),\n * 利用 wireframe() 获取边折线数据,利用 edgeToFaceMap() 获取边→面关联。\n */\nimport type { OcctKernel, ShapeHandle, Mesh, EdgeData, SurfaceKind, CurveKind, BoundingBox, Vec3, XCAFDocument, LabelInfo, LabelTag } from 'occt-wasm'\n\nimport { getSolidColorsOrdered } from './stepColorParser'\nimport { SEWING_TOLERANCE } from '../tolerance'\nimport { computeEffectiveDeflection, type MeshDeflectionOptions } from '../brep/effective-deflection'\nimport { mm } from '../units'\n\n/** A single tessellated mesh produced by the OCCT kernel. */\nexport interface WasmTessellatedMesh {\n positions: Float32Array\n normals: Float32Array\n indices: Uint32Array\n}\n\n/** Result of importing a shape into the OCCT kernel. */\nexport interface WasmImportResult {\n shapeHandle: ShapeHandle\n meshes: WasmTessellatedMesh[]\n meshWithGroups: Mesh\n}\n\n// F5 设计意图说明:\n// OCCT WASM 内核是环境级单例,不是实例级。在整个浏览器页面/Node 进程中只应\n// 初始化一次;多个 CadRuntime 实例共享同一个 kernel 是正确的行为。\n//\n// 2026-09-26 跨实例共享(随 0.18.2 发布):\n// kernelInstance / initPromise / customInitFn 从\"模块级单例\"提升为挂在\n// globalThis 上的共享状态(与 runtime-state.ts 的 `__FAICAD_FAIJS_RUNTIME__`\n// 同款设计)。原因:CDN 装载的第三方库(sheetmetal/cq-compat/faijs-gears)\n// 在 jsDelivr +esm 打包时把 peer `@faicad/faijs` 外部化为**独立模块实例**\n// (根入口与 /api/ 子路径是不同 URL → 不同 bundle),模块级单例导致:\n// - 库实例的 occt 内核从未初始化 → `occt-wasm kernel not initialized`;\n// - 各实例持有不同内核 → 句柄不互通 → `meshShape: Invalid shape ID`。\n// 挂在 globalThis 后,任一实例 initOcctWasm() 产出的内核全局可见,句柄互通。\n// 构建期去重(external / dedupe)仍是主手段,这里是兜底(同 runtime-state 注释)。\n\nconst OCCT_KERNEL_KEY = '__FAICAD_FAIJS_OCCT_KERNEL__'\nconst OCCT_KERNEL_STATE_VERSION = 1\n\n/** occt 内核共享状态(跨 faijs 模块实例,浏览器/Node 双环境)。 */\ninterface OcctKernelSharedState {\n stateVersion: number\n kernelInstance: OcctKernel | null\n initPromise: Promise<OcctKernel> | null\n /** 浏览器 host 注入的 OCCT 初始化函数 */\n customInitFn: (() => Promise<OcctKernel>) | null\n}\n\n/**\n * 获取 occt 内核共享状态(单例)。\n *\n * 挂在 globalThis 上是为了让\"两份 faijs 代码\"(宿主 bundle 一份、第三方库\n * 外部化一份)共享同一份内核状态——否则两份 kernelInstance 导致内核各自\n * 初始化、句柄不互通(几何孤岛)。\n *\n * @returns the shared occt kernel state singleton.\n */\nfunction getOcctKernelSharedState(): OcctKernelSharedState {\n const g = globalThis as unknown as Record<string, unknown>\n const existing = g[OCCT_KERNEL_KEY] as OcctKernelSharedState | undefined\n if (existing) {\n if (existing.stateVersion !== OCCT_KERNEL_STATE_VERSION) {\n throw new Error(\n `[faijs] occt kernel state version mismatch: loaded=${existing.stateVersion}, expected=${OCCT_KERNEL_STATE_VERSION}`,\n )\n }\n return existing\n }\n const created: OcctKernelSharedState = {\n stateVersion: OCCT_KERNEL_STATE_VERSION,\n kernelInstance: null,\n initPromise: null,\n customInitFn: null,\n }\n g[OCCT_KERNEL_KEY] = created\n return created\n}\n\n/**\n * Let the browser host inject the OCCT initialization function.\n *\n * The browser host calls this to register its own init logic (dev/prod/CDN/e2e\n * branches); faijs's initOcctWasm() prefers the injected function. 注入的挂点\n * 写入共享状态——任意 faijs 实例(含 CDN 外部化实例)调 initOcctWasm() 时\n * 都优先使用同一份宿主初始化函数。\n *\n * When nothing is injected, initOcctWasm() reads the WASM from node_modules in\n * a Node environment.\n *\n * @param fn - the initialization function to use, or null to clear\n */\nexport function setOcctWasmInitFn(fn: (() => Promise<OcctKernel>) | null): void {\n const s = getOcctKernelSharedState()\n s.customInitFn = fn\n // 挂点变化后丢弃进行中的初始化(下一次 init 用新挂点重来)。\n s.initPromise = null\n}\n\n/**\n * Resolve the occt-wasm WASM file path (linker-agnostic).\n *\n * Walks the package exports (occt-wasm@3.8.4 exports \"./dist/occt-wasm.wasm\"),\n * independent of cwd / hoisting / pnpm|npm linker (verified pattern C).\n * Replaces the old 4-level `..` path guessing + process.cwd() fallback.\n *\n * Lazy-fetches node:module (Node >= 20.16 process.getBuiltinModule): a static\n * `import { createRequire } from 'node:module'` must not be used — occtKernel is\n * on the browser build's (demo vite build) import chain, and a static node:*\n * import would be externalized and error. This function is only called in the\n * Node branch (initOcctWasm); it never runs in a browser environment.\n *\n * @returns the resolved WASM file path\n */\nexport function resolveOcctWasmPath(): string {\n const builtin = (process as { getBuiltinModule?: (id: string) => unknown }).getBuiltinModule?.('node:module') as\n | { createRequire: (filename: string) => { resolve: (id: string) => string } }\n | undefined\n if (!builtin) {\n throw new Error('[faijs] resolveOcctWasmPath requires Node.js (process.getBuiltinModule)')\n }\n return builtin.createRequire(import.meta.url).resolve('occt-wasm/dist/occt-wasm.wasm')\n}\n\n/**\n * Initialize the occt-wasm kernel (singleton).\n *\n * - Node.js test environment: read the WASM file from node_modules, pass an ArrayBuffer.\n * - Development: direct ESM import, Vite resolves node_modules. The WASM file is loaded from public/wasm/occt-wasm.wasm.\n * - Production: dynamically import the whole module + WASM from a CDN.\n *\n * @returns the initialized raw OCCT kernel (native L2 face — NOT BrepEngineApi;\n * the L1 contract face is built separately by createOcctPrimitives()\n * in brep/engine/adapters/occt.ts as an explicit object literal).\n */\nexport async function initOcctWasm(): Promise<OcctKernel> {\n const s = getOcctKernelSharedState()\n if (s.kernelInstance) return s.kernelInstance\n if (s.initPromise) return s.initPromise\n\n s.initPromise = (async () => {\n // 优先使用浏览器 host 注入的初始化函数(共享挂点,跨实例生效)\n if (s.customInitFn) {\n s.kernelInstance = await s.customInitFn()\n return s.kernelInstance\n }\n\n // Node.js 环境:从 node_modules 读取 WASM 文件\n if (typeof process !== 'undefined' && process.versions?.node) {\n const { OcctKernel: Ctor } = await import('occt-wasm')\n // 与 resolveOcctWasmPath 同款:经 process.getBuiltinModule 取 node:fs,\n // 不用 `await import('node:fs')`——后者会被 vite 打包器静态分析 externalize\n // 并在浏览器构建时报 \"node:fs has been externalized\" warning(本分支运行时\n // 不会在浏览器执行,但打包器仍会对动态 import 字符串告警)。\n const fsBuiltin = (process as { getBuiltinModule?: (id: string) => unknown }).getBuiltinModule?.('node:fs') as\n | { readFileSync: (p: string) => Buffer }\n | undefined\n if (!fsBuiltin) {\n throw new Error('[faijs] occt-wasm init requires Node.js (process.getBuiltinModule)')\n }\n const wasmPath = resolveOcctWasmPath()\n const buf = fsBuiltin.readFileSync(wasmPath)\n const wasmBinary = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer\n s.kernelInstance = await Ctor.init({ wasm: wasmBinary })\n return s.kernelInstance\n }\n\n throw new Error('initOcctWasm: no init function set and not in Node environment. Call setOcctWasmInitFn() first.')\n })()\n\n return s.initPromise\n}\n\n/**\n * Get the initialized kernel instance (initOcctWasm must be called first).\n *\n * @returns the initialized OCCT kernel\n */\nexport function getKernel(): OcctKernel {\n const k = getOcctKernelSharedState().kernelInstance\n if (!k) throw new Error('occt-wasm kernel not initialized — call initOcctWasm() first')\n return k\n}\n\n/**\n * Native-face alias for getKernel() (plan D3 ②): symmetric with\n * getBrepkitKernel() on the brepkit side. Platform-specific code uses this\n * name; the original getKernel() stays for existing host code.\n */\nexport const getOcctKernel = getKernel\n\n/** Release the kernel instance (call when the app unloads). */\nexport function disposeOcctWasm(): void {\n const s = getOcctKernelSharedState()\n if (s.kernelInstance) {\n s.kernelInstance[Symbol.dispose]()\n s.kernelInstance = null\n s.initPromise = null\n }\n}\n\n/** Options controlling mesh deflection during tessellation. */\nexport type { MeshDeflectionOptions } from '../brep/effective-deflection'\n\n/**\n * Compute the effective linear deflection, applying relative scaling\n * exactly as OCCT does internally: `linDefl * bboxDiagonal` when relative=true.\n *\n * 实现已移到引擎中立的 `brep/effective-deflection.ts`(函数体只用\n * `getBoundingBox`,与 OCCT 无关)——此处 re-export 保持既有导入面零迁移。\n * 本模块内部仍要用它,故 import 后再 re-export(纯 re-export 不产生本地绑定)。\n *\n * @param kernel - the OCCT kernel\n * @param shape - the shape whose bounding box drives relative scaling\n * @param options - the requested deflection options\n * @returns the effective linear and angular deflection values\n */\nexport { computeEffectiveDeflection }\n\n/**\n * Import a STEP file to ShapeHandle + Mesh (including face groups).\n *\n * Uses meshShape() rather than tessellate(), so face-group data is available\n * (each face's triangle range [triStart, triCount, faceHash]).\n *\n * @param stepData - STEP file bytes\n * @param deflection - optional mesh deflection options\n * @returns the import result with shape handle and meshes\n */\nexport async function importStepToMesh(\n stepData: ArrayBuffer | Uint8Array,\n deflection?: MeshDeflectionOptions,\n): Promise<WasmImportResult> {\n const kernel = await initOcctWasm()\n const ab = stepData instanceof Uint8Array ? stepData.buffer.slice(stepData.byteOffset, stepData.byteOffset + stepData.byteLength) as ArrayBuffer : stepData\n const shape = kernel.importStep(ab)\n\n const eff = computeEffectiveDeflection(kernel, shape, deflection)\n const mesh = kernel.meshShape(shape, { linearDeflection: eff.linearDeflection, angularDeflection: eff.angularDeflection })\n\n return {\n shapeHandle: shape,\n meshes: [{\n positions: mesh.positions,\n normals: mesh.normals,\n indices: mesh.indices,\n }],\n meshWithGroups: mesh,\n }\n}\n\n// ── Assembly (XCAF) support ──\n\n/** A node in the XCAF assembly tree (mirrors the STEP_T occurrence concept). */\nexport interface AssemblyPartNode {\n /** Dotted path: 'o0', 'o0.o1', 'o0.o1.o2' — matches STEP_T occurrence path. */\n labelPath: string\n /** XCAF label name (falls back to labelPath if empty). */\n name: string\n /** True if this node is an assembly (has child components). */\n isAssembly: boolean\n /**\n * True when `isAssembly` was **synthesised by this reader**, not read from the\n * file: a single XCAF product holding a multi-solid compound gets split into\n * virtual children so each solid becomes its own scene node.\n *\n * The distinction matters to callers that must answer \"is this file really an\n * assembly?\" — e.g. `Assembly.importStep` parity, where upstream rejects a STEP\n * with no assembly structure (`shape_tool.IsAssembly_s` is false for such a\n * product). Without this flag a flat multi-solid STEP looks like an assembly.\n */\n syntheticGroup?: boolean\n /** True if this node is a component reference (leaf part with location). */\n isComponent: boolean\n /** Shape handle with location baked in (for components) or raw shape (for roots).\n * Caller must release this handle. Null for empty assembly labels. */\n shapeHandle: ShapeHandle | null\n /** Deduplication key for prototype shapes (same geometry = same key).\n * Only set for leaf (non-assembly) nodes. */\n prototypeKey: string | null\n /** RGB color [r,g,b] in 0..1 range, or null if no color. */\n color: [number, number, number] | null\n /** Child nodes (recursive). Empty for leaf parts. */\n children: AssemblyPartNode[]\n}\n\nconst IDENTITY_MATRIX = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0]\n\n/**\n * Import a STEP file via XCAF (STEPCAFControl_Reader), preserving the assembly\n * tree, names, colors, and per-component locations.\n *\n * Unlike `importStepToMesh` (which flattens via STEPControl_Reader.OneShape()),\n * this function returns the full assembly tree structure.\n *\n * The caller is responsible for releasing all shapeHandle values in the tree\n * (use `releaseAssemblyTree`).\n *\n * @param stepData - STEP file bytes\n * @returns the root assembly-part nodes\n */\nexport async function importAssemblyFromStep(\n stepData: ArrayBuffer | Uint8Array,\n): Promise<AssemblyPartNode[]> {\n const kernel = (await initOcctWasm()) as unknown as OcctKernel\n const stepText = stepData instanceof Uint8Array\n ? new TextDecoder().decode(stepData)\n : new TextDecoder().decode(new Uint8Array(stepData))\n\n // Parse sub-shape colors from STEP text (fallback for when XCAF label has no color).\n // STEP files from NX/SolidWorks often store colors as STYLED_ITEM on individual\n // solids rather than on XCAF labels, so getLabelInfo returns hasColor=false.\n const solidColors = getSolidColorsOrdered(stepText)\n\n // XCAFDocument.fromSTEP uses STEPCAFControl_Reader with color/name/layer modes\n const doc = kernel.importXCAFFromSTEP(stepText)\n try {\n const rootTags = doc.getRoots()\n const nodes: AssemblyPartNode[] = []\n const cursor = { idx: 0 }\n for (let i = 0; i < rootTags.length; i++) {\n nodes.push(walkLabel(kernel, doc, rootTags[i], `o${i}`, solidColors, cursor))\n }\n return nodes\n } finally {\n doc.close()\n }\n}\n\n/** Walk-context: tracks the current position in the solidColors array across\n * recursive walkLabel calls so that multi-solid compounds consume colors in order. */\ninterface WalkCtx {\n idx: number\n}\n\nfunction walkLabel(\n kernel: OcctKernel,\n doc: XCAFDocument,\n tag: LabelTag,\n path: string,\n solidColors: ([number, number, number] | null)[],\n ctx: WalkCtx,\n): AssemblyPartNode {\n const info: LabelInfo = doc.getLabelInfo(tag)\n const name = info.name || path\n const color = info.hasColor ? [info.color[0], info.color[1], info.color[2]] as [number, number, number] : null\n\n if (info.isAssembly) {\n const childTags = doc.getChildren(tag)\n const children: AssemblyPartNode[] = []\n for (let i = 0; i < childTags.length; i++) {\n children.push(walkLabel(kernel, doc, childTags[i], `${path}.o${i}`, solidColors, ctx))\n }\n // Assembly nodes have no shape of their own; release if one was returned\n if (info.shapeHandle) kernel.release(info.shapeHandle)\n return {\n labelPath: path,\n name,\n isAssembly: true,\n isComponent: false,\n shapeHandle: null,\n prototypeKey: null,\n color,\n children,\n }\n }\n\n // Leaf component — shapeHandle has location baked in (OCCT GetShape semantics)\n // Check if this is a compound with multiple solids — if so, split into\n // separate child nodes so each solid becomes its own mesh/scene-tree node.\n // This handles STEP files that have a single PRODUCT containing a compound\n // of multiple MANIFOLD_SOLID_BREP entities (common in NX/SolidWorks exports).\n if (info.shapeHandle) {\n const solids = kernel.getSubShapes(info.shapeHandle, 'solid')\n if (solids.length > 1) {\n // Multi-solid compound → split into virtual assembly children\n // Each child gets its own solid shapeHandle (already at correct location\n // because getSubShapes extracts from the located compound).\n const children: AssemblyPartNode[] = []\n for (let si = 0; si < solids.length; si++) {\n const childPath = `${path}.s${si}`\n const childName = `${name} [${si + 1}]`\n let childProtoKey: string | null\n try {\n childProtoKey = String(kernel.hashCode(solids[si], 2147483647))\n } catch {\n childProtoKey = null\n }\n // Use STEP-parsed color if label has no color (sub-shape level color)\n const childColor = color ?? (solidColors[ctx.idx] ?? null)\n ctx.idx++\n children.push({\n labelPath: childPath,\n name: childName,\n isAssembly: false,\n isComponent: true,\n shapeHandle: solids[si],\n prototypeKey: childProtoKey,\n color: childColor,\n children: [],\n })\n }\n // Release the compound shape itself — children hold individual solids\n kernel.release(info.shapeHandle)\n return {\n labelPath: path,\n name,\n isAssembly: true, // mark as assembly so it becomes a group node\n syntheticGroup: true, // ...but it is NOT an assembly in the file\n isComponent: false,\n shapeHandle: null,\n prototypeKey: null,\n color,\n children,\n }\n }\n // Single solid (or non-solid) — release the extra sub-shape handles\n for (const s of solids) kernel.release(s)\n }\n\n let prototypeKey: string | null = null\n if (info.shapeHandle) {\n // Get un-located shape for dedup (located with identity = remove location)\n try {\n const unlocated = kernel.located(info.shapeHandle, IDENTITY_MATRIX)\n prototypeKey = String(kernel.hashCode(unlocated, 2147483647))\n kernel.release(unlocated)\n } catch {\n // Fallback: use shapeHandle hash directly (less accurate dedup)\n prototypeKey = String(kernel.hashCode(info.shapeHandle, 2147483647))\n }\n }\n\n // For single-solid leaf parts, also try STEP-parsed color as fallback\n const finalColor = color ?? (solidColors[ctx.idx] ?? null)\n ctx.idx++\n\n return {\n labelPath: path,\n name,\n isAssembly: false,\n isComponent: info.isComponent,\n shapeHandle: info.shapeHandle,\n prototypeKey,\n color: finalColor,\n children: [],\n }\n}\n\n/** Recursively release all shapeHandle values in an assembly tree.\n *\n * @param kernel - the OCCT kernel used to release handles\n * @param nodes - the assembly tree nodes to release\n */\nexport function releaseAssemblyTree(kernel: OcctKernel, nodes: AssemblyPartNode[]): void {\n for (const node of nodes) {\n if (node.shapeHandle) kernel.release(node.shapeHandle)\n if (node.children.length > 0) releaseAssemblyTree(kernel, node.children)\n }\n}\n\n/** Collect all leaf (non-assembly) nodes from an assembly tree.\n *\n * @param nodes - the assembly tree nodes to traverse\n * @returns the collected leaf part nodes in depth-first order\n */\nexport function collectLeafParts(nodes: AssemblyPartNode[]): AssemblyPartNode[] {\n const leaves: AssemblyPartNode[] = []\n function walk(node: AssemblyPartNode) {\n if (node.isAssembly) {\n for (const child of node.children) walk(child)\n } else {\n leaves.push(node)\n }\n }\n for (const node of nodes) walk(node)\n return leaves\n}\n\n/**\n * Import BREP text to ShapeHandle + Mesh.\n *\n * @param brepData - BREP file content as a string\n * @param deflection - optional mesh deflection options\n * @returns the import result with shape handle and meshes\n */\nexport async function importBrepToMesh(\n brepData: string,\n deflection?: MeshDeflectionOptions,\n): Promise<WasmImportResult> {\n const kernel = await initOcctWasm()\n const shape = kernel.fromBREP(brepData)\n\n const eff = computeEffectiveDeflection(kernel, shape, deflection)\n const mesh = kernel.meshShape(shape, { linearDeflection: eff.linearDeflection, angularDeflection: eff.angularDeflection })\n\n return {\n shapeHandle: shape,\n meshes: [{\n positions: mesh.positions,\n normals: mesh.normals,\n indices: mesh.indices,\n }],\n meshWithGroups: mesh,\n }\n}\n\n/**\n * Mesh → STEP export: rebuild a STEP solid from a triangle mesh.\n * Follows the pattern from occt-wasm/examples/stl2step.mjs.\n *\n * @param positions - vertex array [x0,y0,z0, x1,y1,z1, ...]\n * @param indices - index array [i0,i1,i2, i3,i4,i5, ...]\n * @param tolerance - sewing tolerance in mm (default 0.01)\n * @returns the STEP file content string\n */\nexport function meshesToStep(\n positions: Float32Array,\n indices: Uint32Array,\n tolerance = SEWING_TOLERANCE.as(mm),\n): string {\n const kernel = getKernel()\n const faces: ShapeHandle[] = []\n let solid: ShapeHandle | null = null\n\n try {\n for (let i = 0; i < indices.length; i += 3) {\n const ia = indices[i] * 3\n const ib = indices[i + 1] * 3\n const ic = indices[i + 2] * 3\n const face = kernel.buildTriFace(\n { x: positions[ia], y: positions[ia + 1], z: positions[ia + 2] },\n { x: positions[ib], y: positions[ib + 1], z: positions[ib + 2] },\n { x: positions[ic], y: positions[ic + 1], z: positions[ic + 2] },\n )\n faces.push(face)\n }\n\n solid = kernel.sewAndSolidify(faces, tolerance)\n const unified = kernel.unifySameDomain(solid)\n kernel.release(solid)\n solid = unified\n return kernel.exportStep(solid)\n } finally {\n if (solid !== null) kernel.release(solid)\n for (const f of faces) kernel.release(f)\n }\n}\n\n/**\n * Release a shape handle.\n *\n * @param handle - the shape handle to release\n */\nexport function releaseShape(handle: ShapeHandle): void {\n const k = getOcctKernelSharedState().kernelInstance\n if (k) k.release(handle)\n}\n\n/** 导出类型供外部使用 */\nexport type { OcctKernel, ShapeHandle, Mesh, EdgeData, SurfaceKind, CurveKind, BoundingBox, Vec3, XCAFDocument, LabelInfo, LabelTag }\n"]}
1
+ {"version":3,"file":"occtKernel.js","sourceRoot":"","sources":["../../src/occt-kernel/occtKernel.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * occt-wasm 封装层 — 替代 occt-import-js\n *\n * 提供 STEP/BREP → Mesh 转换和 Mesh → STEP 导出能力。\n * 利用 occt-wasm 的 meshShape() 获取 faceGroups(面→三角形映射),\n * 利用 wireframe() 获取边折线数据,利用 edgeToFaceMap() 获取边→面关联。\n */\nimport type { OcctKernel, ShapeHandle, Mesh, EdgeData, SurfaceKind, CurveKind, BoundingBox, Vec3, XCAFDocument, LabelInfo, LabelTag } from 'occt-wasm'\n\nimport { getSolidColorsOrdered } from './stepColorParser'\nimport { SEWING_TOLERANCE } from '../tolerance'\nimport { computeEffectiveDeflection, type MeshDeflectionOptions } from '../brep/effective-deflection'\nimport { mm } from '../units'\n\n/** A single tessellated mesh produced by the OCCT kernel. */\nexport interface WasmTessellatedMesh {\n positions: Float32Array\n normals: Float32Array\n indices: Uint32Array\n}\n\n/** Result of importing a shape into the OCCT kernel. */\nexport interface WasmImportResult {\n shapeHandle: ShapeHandle\n meshes: WasmTessellatedMesh[]\n meshWithGroups: Mesh\n}\n\n// F5 设计意图说明:\n// OCCT WASM 内核是环境级单例,不是实例级。在整个浏览器页面/Node 进程中只应\n// 初始化一次;多个 CadRuntime 实例共享同一个 kernel 是正确的行为。\n//\n// 2026-09-26 跨实例共享(随 0.18.2 发布):\n// kernelInstance / initPromise / customInitFn 从\"模块级单例\"提升为挂在\n// globalThis 上的共享状态(与 runtime-state.ts 的 `__FAICAD_FAIJS_RUNTIME__`\n// 同款设计)。原因:CDN 装载的第三方库(sheetmetal/cq-compat/faijs-gears)\n// 在 jsDelivr +esm 打包时把 peer `@faicad/faijs` 外部化为**独立模块实例**\n// (根入口与 /api/ 子路径是不同 URL → 不同 bundle),模块级单例导致:\n// - 库实例的 occt 内核从未初始化 → `occt-wasm kernel not initialized`;\n// - 各实例持有不同内核 → 句柄不互通 → `meshShape: Invalid shape ID`。\n// 挂在 globalThis 后,任一实例 initOcctWasm() 产出的内核全局可见,句柄互通。\n// 构建期去重(external / dedupe)仍是主手段,这里是兜底(同 runtime-state 注释)。\n\nconst OCCT_KERNEL_KEY = '__FAICAD_FAIJS_OCCT_KERNEL__'\nconst OCCT_KERNEL_STATE_VERSION = 1\n\n/** occt 内核共享状态(跨 faijs 模块实例,浏览器/Node 双环境)。 */\ninterface OcctKernelSharedState {\n stateVersion: number\n kernelInstance: OcctKernel | null\n initPromise: Promise<OcctKernel> | null\n /** 浏览器 host 注入的 OCCT 初始化函数 */\n customInitFn: (() => Promise<OcctKernel>) | null\n}\n\n/**\n * 获取 occt 内核共享状态(单例)。\n *\n * 挂在 globalThis 上是为了让\"两份 faijs 代码\"(宿主 bundle 一份、第三方库\n * 外部化一份)共享同一份内核状态——否则两份 kernelInstance 导致内核各自\n * 初始化、句柄不互通(几何孤岛)。\n *\n * @returns the shared occt kernel state singleton.\n */\nfunction getOcctKernelSharedState(): OcctKernelSharedState {\n const g = globalThis as unknown as Record<string, unknown>\n const existing = g[OCCT_KERNEL_KEY] as OcctKernelSharedState | undefined\n if (existing) {\n if (existing.stateVersion !== OCCT_KERNEL_STATE_VERSION) {\n throw new Error(\n `[faijs] occt kernel state version mismatch: loaded=${existing.stateVersion}, expected=${OCCT_KERNEL_STATE_VERSION}`,\n )\n }\n return existing\n }\n const created: OcctKernelSharedState = {\n stateVersion: OCCT_KERNEL_STATE_VERSION,\n kernelInstance: null,\n initPromise: null,\n customInitFn: null,\n }\n g[OCCT_KERNEL_KEY] = created\n return created\n}\n\n/**\n * Let the browser host inject the OCCT initialization function.\n *\n * The browser host calls this to register its own init logic (dev/prod/CDN/e2e\n * branches); faijs's initOcctWasm() prefers the injected function. 注入的挂点\n * 写入共享状态——任意 faijs 实例(含 CDN 外部化实例)调 initOcctWasm() 时\n * 都优先使用同一份宿主初始化函数。\n *\n * When nothing is injected, initOcctWasm() reads the WASM from node_modules in\n * a Node environment.\n *\n * @param fn - the initialization function to use, or null to clear\n */\nexport function setOcctWasmInitFn(fn: (() => Promise<OcctKernel>) | null): void {\n const s = getOcctKernelSharedState()\n s.customInitFn = fn\n // 挂点变化后丢弃进行中的初始化(下一次 init 用新挂点重来)。\n s.initPromise = null\n}\n\n/**\n * Resolve the occt-wasm WASM file path (linker-agnostic).\n *\n * Walks the package exports (occt-wasm@5.6.0 exports \"./dist/occt-wasm.wasm\"),\n * independent of cwd / hoisting / pnpm|npm linker (verified pattern C).\n * Replaces the old 4-level `..` path guessing + process.cwd() fallback.\n *\n * Lazy-fetches node:module (Node >= 20.16 process.getBuiltinModule): a static\n * `import { createRequire } from 'node:module'` must not be used — occtKernel is\n * on the browser build's (demo vite build) import chain, and a static node:*\n * import would be externalized and error. This function is only called in the\n * Node branch (initOcctWasm); it never runs in a browser environment.\n *\n * @returns the resolved WASM file path\n */\nexport function resolveOcctWasmPath(): string {\n const builtin = (process as { getBuiltinModule?: (id: string) => unknown }).getBuiltinModule?.('node:module') as\n | { createRequire: (filename: string) => { resolve: (id: string) => string } }\n | undefined\n if (!builtin) {\n throw new Error('[faijs] resolveOcctWasmPath requires Node.js (process.getBuiltinModule)')\n }\n return builtin.createRequire(import.meta.url).resolve('occt-wasm/dist/occt-wasm.wasm')\n}\n\n/**\n * Initialize the occt-wasm kernel (singleton).\n *\n * - Node.js test environment: read the WASM file from node_modules, pass an ArrayBuffer.\n * - Development: direct ESM import, Vite resolves node_modules. The WASM file is loaded from public/wasm/occt-wasm.wasm.\n * - Production: dynamically import the whole module + WASM from a CDN.\n *\n * @returns the initialized raw OCCT kernel (native L2 face — NOT BrepEngineApi;\n * the L1 contract face is built separately by createOcctPrimitives()\n * in brep/engine/adapters/occt.ts as an explicit object literal).\n */\nexport async function initOcctWasm(): Promise<OcctKernel> {\n const s = getOcctKernelSharedState()\n if (s.kernelInstance) return s.kernelInstance\n if (s.initPromise) return s.initPromise\n\n s.initPromise = (async () => {\n // 优先使用浏览器 host 注入的初始化函数(共享挂点,跨实例生效)\n if (s.customInitFn) {\n s.kernelInstance = await s.customInitFn()\n return s.kernelInstance\n }\n\n // Node.js 环境:从 node_modules 读取 WASM 文件\n if (typeof process !== 'undefined' && process.versions?.node) {\n const { OcctKernel: Ctor } = await import('occt-wasm')\n // 与 resolveOcctWasmPath 同款:经 process.getBuiltinModule 取 node:fs,\n // 不用 `await import('node:fs')`——后者会被 vite 打包器静态分析 externalize\n // 并在浏览器构建时报 \"node:fs has been externalized\" warning(本分支运行时\n // 不会在浏览器执行,但打包器仍会对动态 import 字符串告警)。\n const fsBuiltin = (process as { getBuiltinModule?: (id: string) => unknown }).getBuiltinModule?.('node:fs') as\n | { readFileSync: (p: string) => Buffer }\n | undefined\n if (!fsBuiltin) {\n throw new Error('[faijs] occt-wasm init requires Node.js (process.getBuiltinModule)')\n }\n const wasmPath = resolveOcctWasmPath()\n const buf = fsBuiltin.readFileSync(wasmPath)\n const wasmBinary = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer\n s.kernelInstance = await Ctor.init({ wasm: wasmBinary })\n return s.kernelInstance\n }\n\n throw new Error('initOcctWasm: no init function set and not in Node environment. Call setOcctWasmInitFn() first.')\n })()\n\n return s.initPromise\n}\n\n/**\n * Get the initialized kernel instance (initOcctWasm must be called first).\n *\n * @returns the initialized OCCT kernel\n */\nexport function getKernel(): OcctKernel {\n const k = getOcctKernelSharedState().kernelInstance\n if (!k) throw new Error('occt-wasm kernel not initialized — call initOcctWasm() first')\n return k\n}\n\n/**\n * Native-face alias for getKernel() (plan D3 ②): symmetric with\n * getBrepkitKernel() on the brepkit side. Platform-specific code uses this\n * name; the original getKernel() stays for existing host code.\n */\nexport const getOcctKernel = getKernel\n\n/** Release the kernel instance (call when the app unloads). */\nexport function disposeOcctWasm(): void {\n const s = getOcctKernelSharedState()\n if (s.kernelInstance) {\n s.kernelInstance[Symbol.dispose]()\n s.kernelInstance = null\n s.initPromise = null\n }\n}\n\n/** Options controlling mesh deflection during tessellation. */\nexport type { MeshDeflectionOptions } from '../brep/effective-deflection'\n\n/**\n * Compute the effective linear deflection, applying relative scaling\n * exactly as OCCT does internally: `linDefl * bboxDiagonal` when relative=true.\n *\n * 实现已移到引擎中立的 `brep/effective-deflection.ts`(函数体只用\n * `getBoundingBox`,与 OCCT 无关)——此处 re-export 保持既有导入面零迁移。\n * 本模块内部仍要用它,故 import 后再 re-export(纯 re-export 不产生本地绑定)。\n *\n * @param kernel - the OCCT kernel\n * @param shape - the shape whose bounding box drives relative scaling\n * @param options - the requested deflection options\n * @returns the effective linear and angular deflection values\n */\nexport { computeEffectiveDeflection }\n\n/**\n * Import a STEP file to ShapeHandle + Mesh (including face groups).\n *\n * Uses meshShape() rather than tessellate(), so face-group data is available\n * (each face's triangle range [triStart, triCount, faceHash]).\n *\n * @param stepData - STEP file bytes\n * @param deflection - optional mesh deflection options\n * @returns the import result with shape handle and meshes\n */\nexport async function importStepToMesh(\n stepData: ArrayBuffer | Uint8Array,\n deflection?: MeshDeflectionOptions,\n): Promise<WasmImportResult> {\n const kernel = await initOcctWasm()\n const ab = stepData instanceof Uint8Array ? stepData.buffer.slice(stepData.byteOffset, stepData.byteOffset + stepData.byteLength) as ArrayBuffer : stepData\n const shape = kernel.importStep(ab)\n\n const eff = computeEffectiveDeflection(kernel, shape, deflection)\n const mesh = kernel.meshShape(shape, { linearDeflection: eff.linearDeflection, angularDeflection: eff.angularDeflection })\n\n return {\n shapeHandle: shape,\n meshes: [{\n positions: mesh.positions,\n normals: mesh.normals,\n indices: mesh.indices,\n }],\n meshWithGroups: mesh,\n }\n}\n\n// ── Assembly (XCAF) support ──\n\n/** A node in the XCAF assembly tree (mirrors the STEP_T occurrence concept). */\nexport interface AssemblyPartNode {\n /** Dotted path: 'o0', 'o0.o1', 'o0.o1.o2' — matches STEP_T occurrence path. */\n labelPath: string\n /** XCAF label name (falls back to labelPath if empty). */\n name: string\n /** True if this node is an assembly (has child components). */\n isAssembly: boolean\n /**\n * True when `isAssembly` was **synthesised by this reader**, not read from the\n * file: a single XCAF product holding a multi-solid compound gets split into\n * virtual children so each solid becomes its own scene node.\n *\n * The distinction matters to callers that must answer \"is this file really an\n * assembly?\" — e.g. `Assembly.importStep` parity, where upstream rejects a STEP\n * with no assembly structure (`shape_tool.IsAssembly_s` is false for such a\n * product). Without this flag a flat multi-solid STEP looks like an assembly.\n */\n syntheticGroup?: boolean\n /** True if this node is a component reference (leaf part with location). */\n isComponent: boolean\n /** Shape handle with location baked in (for components) or raw shape (for roots).\n * Caller must release this handle. Null for empty assembly labels. */\n shapeHandle: ShapeHandle | null\n /** Deduplication key for prototype shapes (same geometry = same key).\n * Only set for leaf (non-assembly) nodes. */\n prototypeKey: string | null\n /** RGB color [r,g,b] in 0..1 range, or null if no color. */\n color: [number, number, number] | null\n /** Child nodes (recursive). Empty for leaf parts. */\n children: AssemblyPartNode[]\n}\n\nconst IDENTITY_MATRIX = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0]\n\n/**\n * Import a STEP file via XCAF (STEPCAFControl_Reader), preserving the assembly\n * tree, names, colors, and per-component locations.\n *\n * Unlike `importStepToMesh` (which flattens via STEPControl_Reader.OneShape()),\n * this function returns the full assembly tree structure.\n *\n * The caller is responsible for releasing all shapeHandle values in the tree\n * (use `releaseAssemblyTree`).\n *\n * @param stepData - STEP file bytes\n * @returns the root assembly-part nodes\n */\nexport async function importAssemblyFromStep(\n stepData: ArrayBuffer | Uint8Array,\n): Promise<AssemblyPartNode[]> {\n const kernel = (await initOcctWasm()) as unknown as OcctKernel\n const stepText = stepData instanceof Uint8Array\n ? new TextDecoder().decode(stepData)\n : new TextDecoder().decode(new Uint8Array(stepData))\n\n // Parse sub-shape colors from STEP text (fallback for when XCAF label has no color).\n // STEP files from NX/SolidWorks often store colors as STYLED_ITEM on individual\n // solids rather than on XCAF labels, so getLabelInfo returns hasColor=false.\n const solidColors = getSolidColorsOrdered(stepText)\n\n // XCAFDocument.fromSTEP uses STEPCAFControl_Reader with color/name/layer modes\n const doc = kernel.importXCAFFromSTEP(stepText)\n try {\n const rootTags = doc.getRoots()\n const nodes: AssemblyPartNode[] = []\n const cursor = { idx: 0 }\n for (let i = 0; i < rootTags.length; i++) {\n nodes.push(walkLabel(kernel, doc, rootTags[i], `o${i}`, solidColors, cursor))\n }\n // P2 修复(2026-10-06):文档关闭前把全部 leaf shapeHandle 提升为独立副本。\n // getLabelInfo 返回的句柄生命周期绑定 XCAF 文档(doc.close() 释放文档资源),\n // 直接返回会让调用方拿到悬空句柄——BOP(common/cut 等)在 worker 环境内存\n // 复用后访问悬空句柄挂死(node 内存不复用侥幸通过;e2e/worker 必现)。\n // BRepBuilderAPI_Copy 深拷贝独立于文档,release 原句柄后副本生命周期由调用方\n // 掌控(releaseAssemblyTree / 各消费方的 release 路径)。\n for (const n of nodes) liftShapesFromDocument(kernel, n)\n return nodes\n } finally {\n doc.close()\n }\n}\n\n/** 递归把节点树中所有 leaf shapeHandle 从文档句柄提升为独立副本(P2,2026-10-06)。 */\nfunction liftShapesFromDocument(kernel: OcctKernel, node: AssemblyPartNode): void {\n if (node.shapeHandle) {\n const copied = kernel.copy(node.shapeHandle)\n kernel.release(node.shapeHandle)\n node.shapeHandle = copied\n }\n for (const child of node.children) liftShapesFromDocument(kernel, child)\n}\n\n/** Walk-context: tracks the current position in the solidColors array across\n * recursive walkLabel calls so that multi-solid compounds consume colors in order. */\ninterface WalkCtx {\n idx: number\n}\n\nfunction walkLabel(\n kernel: OcctKernel,\n doc: XCAFDocument,\n tag: LabelTag,\n path: string,\n solidColors: ([number, number, number] | null)[],\n ctx: WalkCtx,\n): AssemblyPartNode {\n const info: LabelInfo = doc.getLabelInfo(tag)\n const name = info.name || path\n const color = info.hasColor ? [info.color[0], info.color[1], info.color[2]] as [number, number, number] : null\n\n if (info.isAssembly) {\n const childTags = doc.getChildren(tag)\n const children: AssemblyPartNode[] = []\n for (let i = 0; i < childTags.length; i++) {\n children.push(walkLabel(kernel, doc, childTags[i], `${path}.o${i}`, solidColors, ctx))\n }\n // Assembly nodes have no shape of their own; release if one was returned\n if (info.shapeHandle) kernel.release(info.shapeHandle)\n return {\n labelPath: path,\n name,\n isAssembly: true,\n isComponent: false,\n shapeHandle: null,\n prototypeKey: null,\n color,\n children,\n }\n }\n\n // Leaf component — shapeHandle has location baked in (OCCT GetShape semantics)\n // Check if this is a compound with multiple solids — if so, split into\n // separate child nodes so each solid becomes its own mesh/scene-tree node.\n // This handles STEP files that have a single PRODUCT containing a compound\n // of multiple MANIFOLD_SOLID_BREP entities (common in NX/SolidWorks exports).\n if (info.shapeHandle) {\n const solids = kernel.getSubShapes(info.shapeHandle, 'solid')\n if (solids.length > 1) {\n // Multi-solid compound → split into virtual assembly children\n // Each child gets its own solid shapeHandle (already at correct location\n // because getSubShapes extracts from the located compound).\n const children: AssemblyPartNode[] = []\n for (let si = 0; si < solids.length; si++) {\n const childPath = `${path}.s${si}`\n const childName = `${name} [${si + 1}]`\n let childProtoKey: string | null\n try {\n childProtoKey = String(kernel.hashCode(solids[si], 2147483647))\n } catch {\n childProtoKey = null\n }\n // Use STEP-parsed color if label has no color (sub-shape level color)\n const childColor = color ?? (solidColors[ctx.idx] ?? null)\n ctx.idx++\n children.push({\n labelPath: childPath,\n name: childName,\n isAssembly: false,\n isComponent: true,\n shapeHandle: solids[si],\n prototypeKey: childProtoKey,\n color: childColor,\n children: [],\n })\n }\n // Release the compound shape itself — children hold individual solids\n kernel.release(info.shapeHandle)\n return {\n labelPath: path,\n name,\n isAssembly: true, // mark as assembly so it becomes a group node\n syntheticGroup: true, // ...but it is NOT an assembly in the file\n isComponent: false,\n shapeHandle: null,\n prototypeKey: null,\n color,\n children,\n }\n }\n // Single solid (or non-solid) — release the extra sub-shape handles\n for (const s of solids) kernel.release(s)\n }\n\n let prototypeKey: string | null = null\n if (info.shapeHandle) {\n // Get un-located shape for dedup (located with identity = remove location)\n try {\n const unlocated = kernel.located(info.shapeHandle, IDENTITY_MATRIX)\n prototypeKey = String(kernel.hashCode(unlocated, 2147483647))\n kernel.release(unlocated)\n } catch {\n // Fallback: use shapeHandle hash directly (less accurate dedup)\n prototypeKey = String(kernel.hashCode(info.shapeHandle, 2147483647))\n }\n }\n\n // For single-solid leaf parts, also try STEP-parsed color as fallback\n const finalColor = color ?? (solidColors[ctx.idx] ?? null)\n ctx.idx++\n\n return {\n labelPath: path,\n name,\n isAssembly: false,\n isComponent: info.isComponent,\n shapeHandle: info.shapeHandle,\n prototypeKey,\n color: finalColor,\n children: [],\n }\n}\n\n/** Recursively release all shapeHandle values in an assembly tree.\n *\n * @param kernel - the OCCT kernel used to release handles\n * @param nodes - the assembly tree nodes to release\n */\nexport function releaseAssemblyTree(kernel: OcctKernel, nodes: AssemblyPartNode[]): void {\n for (const node of nodes) {\n if (node.shapeHandle) kernel.release(node.shapeHandle)\n if (node.children.length > 0) releaseAssemblyTree(kernel, node.children)\n }\n}\n\n/** Collect all leaf (non-assembly) nodes from an assembly tree.\n *\n * @param nodes - the assembly tree nodes to traverse\n * @returns the collected leaf part nodes in depth-first order\n */\nexport function collectLeafParts(nodes: AssemblyPartNode[]): AssemblyPartNode[] {\n const leaves: AssemblyPartNode[] = []\n function walk(node: AssemblyPartNode) {\n if (node.isAssembly) {\n for (const child of node.children) walk(child)\n } else {\n leaves.push(node)\n }\n }\n for (const node of nodes) walk(node)\n return leaves\n}\n\n/**\n * Import BREP text to ShapeHandle + Mesh.\n *\n * @param brepData - BREP file content as a string\n * @param deflection - optional mesh deflection options\n * @returns the import result with shape handle and meshes\n */\nexport async function importBrepToMesh(\n brepData: string,\n deflection?: MeshDeflectionOptions,\n): Promise<WasmImportResult> {\n const kernel = await initOcctWasm()\n const shape = kernel.fromBREP(brepData)\n\n const eff = computeEffectiveDeflection(kernel, shape, deflection)\n const mesh = kernel.meshShape(shape, { linearDeflection: eff.linearDeflection, angularDeflection: eff.angularDeflection })\n\n return {\n shapeHandle: shape,\n meshes: [{\n positions: mesh.positions,\n normals: mesh.normals,\n indices: mesh.indices,\n }],\n meshWithGroups: mesh,\n }\n}\n\n/**\n * Mesh → STEP export: rebuild a STEP solid from a triangle mesh.\n * Follows the pattern from occt-wasm/examples/stl2step.mjs.\n *\n * @param positions - vertex array [x0,y0,z0, x1,y1,z1, ...]\n * @param indices - index array [i0,i1,i2, i3,i4,i5, ...]\n * @param tolerance - sewing tolerance in mm (default 0.01)\n * @returns the STEP file content string\n */\nexport function meshesToStep(\n positions: Float32Array,\n indices: Uint32Array,\n tolerance = SEWING_TOLERANCE.as(mm),\n): string {\n const kernel = getKernel()\n const faces: ShapeHandle[] = []\n let solid: ShapeHandle | null = null\n\n try {\n for (let i = 0; i < indices.length; i += 3) {\n const ia = indices[i] * 3\n const ib = indices[i + 1] * 3\n const ic = indices[i + 2] * 3\n const face = kernel.buildTriFace(\n { x: positions[ia], y: positions[ia + 1], z: positions[ia + 2] },\n { x: positions[ib], y: positions[ib + 1], z: positions[ib + 2] },\n { x: positions[ic], y: positions[ic + 1], z: positions[ic + 2] },\n )\n faces.push(face)\n }\n\n solid = kernel.sewAndSolidify(faces, tolerance)\n const unified = kernel.unifySameDomain(solid)\n kernel.release(solid)\n solid = unified\n return kernel.exportStep(solid)\n } finally {\n if (solid !== null) kernel.release(solid)\n for (const f of faces) kernel.release(f)\n }\n}\n\n/**\n * Release a shape handle.\n *\n * @param handle - the shape handle to release\n */\nexport function releaseShape(handle: ShapeHandle): void {\n const k = getOcctKernelSharedState().kernelInstance\n if (k) k.release(handle)\n}\n\n/** 导出类型供外部使用 */\nexport type { OcctKernel, ShapeHandle, Mesh, EdgeData, SurfaceKind, CurveKind, BoundingBox, Vec3, XCAFDocument, LabelInfo, LabelTag }\n"]}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * STEP 元数据解析器 — 从 STEP (P21) 文本头部与 PRODUCT 层提取
3
+ * FileMeta(文件级)与 ShapeMeta(零件级描述字/料号)。
4
+ *
5
+ * 与 stepColorParser 同一原则:纯文本扫描,不依赖 OCCT 内核(XCAF label 层
6
+ * 是否暴露 description/属性不确定,见设计文档 2026-10-05-meta §6.3 风险 2)。
7
+ *
8
+ * 读取面映射(§3.3):
9
+ * - HEADER FILE_NAME(name,time_stamp,author,organization,preprocessor,originator)
10
+ * → title / creationDate / author / organization / application / designer。
11
+ * - HEADER FILE_DESCRIPTION(...) → description(逗号拼接,去首尾引号)。
12
+ * - DATA PRODUCT(name,description,frame)(第一个、leaf 使用的)→ 零件 description。
13
+ * name 已由 OCCT label 提供(不在本解析器处理)。
14
+ * - PRODUCT → PRODUCT_DEFINITION_FORMATION/WITH_SPECIFIED_SOURCE-关联的料号通道:
15
+ * PART_NUMBER_PROPERTY/IDENTIFICATION 命名在 §3.3 表里列出的 PART 层通道(P4
16
+ * 标 "IDENTIFICATION 内核支持" 待实测),这里尽量从 PRODUCT_DEFINITION 挂的
17
+ * UDA(GENERAL_PROPERTY + PROPERTY_DEFINITION)捞自定义属性。
18
+ *
19
+ * 所有扫描都容错:找不到就不给对应字段,绝不让解析器抛(信息性收益)。
20
+ */
21
+ /** Header 级人物贡献字段(FILE_NAME 组内的三四五参数)。 */
22
+ export interface StepFileMeta {
23
+ title?: string;
24
+ creationDate?: string;
25
+ designer?: string;
26
+ author?: string;
27
+ organization?: string;
28
+ application?: string;
29
+ description?: string;
30
+ /** 自定义 FILE_DESCRIPTION/FILE_NAME 之外的 vendor 属性(metadata 笼)。 */
31
+ metadata?: Record<string, string>;
32
+ }
33
+ /** STEP 伙伴级 P21 解析出的轻量属性。 */
34
+ export interface StepPartMeta {
35
+ /** 产品描述(PRODUCT( ..., description, id ))。空串/缺省不设。 */
36
+ description?: string;
37
+ /** 自定义属性:`PROPERTY_DEFINITION(...)` + `GENERAL_PROPERTY('name', value, ...)`。 */
38
+ metadata?: Record<string, string>;
39
+ }
40
+ /** Header 段整块(FILE_NAME / FILE_DESCRIPTION / FILE_SCHEMA)→ FileMeta。 */
41
+ export declare function parseStepHeaderMeta(text: string): StepFileMeta;
42
+ /** 伙伴层 PRODUCT 描述 + 根相关字段解析(简化:只取第一个 PRODUCT)。 */
43
+ export declare function parseStepPartMeta(text: string): StepPartMeta;
44
+ //# sourceMappingURL=stepMetaParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepMetaParser.d.ts","sourceRoot":"","sources":["../../src/occt-kernel/stepMetaParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,0CAA0C;AAC1C,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,6BAA6B;AAC7B,MAAM,WAAW,YAAY;IAC3B,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AA2DD,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA+C9D;AAED,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAyB5D"}