@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
@@ -22,6 +22,7 @@ import * as THREE from 'three';
22
22
  import type { BrepHandle } from './engine/types.js';
23
23
  import type { BrepEngineApi } from './engine/primitives.js';
24
24
  import type { Shape, Vec3 } from '../mesh/types.js';
25
+ import type { ImportAssemblyNode } from '../mesh/import-model.js';
25
26
  import type { BrepChainState } from './brep-chain.js';
26
27
  import type { PartName } from '../identity.js';
27
28
  /**
@@ -62,13 +63,62 @@ export declare function translateBrep(kernel: BrepEngineApi, solid: BrepHandle,
62
63
  * @returns 新实体
63
64
  */
64
65
  export declare function rotateBrep(kernel: BrepEngineApi, solid: BrepHandle, angles: Vec3, pivot?: Vec3): BrepHandle;
66
+ /**
67
+ * 判定 3×4 行主序仿射矩阵的线性部分是否为**相似变换**(旋转/反射 × 等比缩放)——
68
+ * 即 `gp_Trsf` 能精确承载、`kernel.transform`(BRepBuilderAPI_Transform)唯一
69
+ * 正确处理的那一类。
70
+ *
71
+ * 判据必须用**相对**容差,不能像 2026-10-07 之前那样用绝对容差:
72
+ * GOTCHA(2026-10-07,openscad example023 parity)——一个 60° 刚体旋转只要按
73
+ * 7 位小数打印(`0.8660254`),行范数就是 `0.99999999645`(与 1 相差 3.6e-9)。
74
+ * 绝对容差 1e-9 会判定 `|‖row2‖ − ‖row0‖| = 3.6e-9 > 1e-9` ⇒ 把这个**纯旋转**
75
+ * 判成"非相似",从而错误地走进 `generalTransform`;而 occt 侧 `gp_GTrsf` 路径在
76
+ * **已三角化**的形状上会重复计入被平移面的 TopLoc(顶盖 z 由 5 变 10,绕过在
77
+ * `occt-kernel/occt-primitives.ts` 的 `generalTransform` 适配层,本层不感知)。
78
+ * 相对容差 1e-6 覆盖 7 位小数打印精度,同时仍能区分真正的非等比缩放
79
+ * (如 z×2.5 行范数相差 2.5 倍)。正交性同用 1e-6:7 位小数打印的旋转,行点积
80
+ * 误差上界约 2e-7。
81
+ *
82
+ * @param m12 - 3×4 行主序矩阵(12 元素:`[r00,r01,r02,tx, r10,r11,r12,ty, r20,r21,r22,tz]`)。
83
+ * @returns `true` 当且仅当线性部分可逆且为相似变换。
84
+ */
85
+ export declare function isSimilarityAffine(m12: readonly number[]): boolean;
86
+ /**
87
+ * 施加 3×4 行主序仿射矩阵,按矩阵类别选**唯一正确**的 OCCT 路径。
88
+ *
89
+ * 两条路径的差异是**正确性**而不只是性能:
90
+ * - 相似(旋转/反射 × 等比缩放)→ `kernel.transform`(BRepBuilderAPI_Transform)。
91
+ * - 其余(非等比缩放、错切)→ `kernel.generalTransform`(gp_GTrsf)。
92
+ *
93
+ * GOTCHA(2026-10-07):occt 的 `generalTransform` 在**已经三角化过**的形状上会
94
+ * 重复计入被平移面的 TopLoc(精确 z∈[0,5],网格顶盖却落在 z=10;非等比 z×2.5 时
95
+ * 12.5 vs 17.5)。该缺陷是 **occt 专属**(brepkit 的 GTrsf 路径干净),因此绕过
96
+ * **不在本层**——本层是引擎中立分派,让每个引擎都为 occt 的毛病多付一次句柄分配
97
+ * 是错的(还会扰动 brepkit 的 `cut` bbox,见 multi-engine-op-parity)。
98
+ * 绕过落在 occt 适配层:`occt-kernel/occt-primitives.ts` 的 `generalTransform`
99
+ * 先 `copy` 再变换。`kernel.transform` 无此问题,故相似矩阵不付这份深拷贝成本。
100
+ *
101
+ * 反向陷阱:把非相似矩阵交给 `kernel.transform` 是**静默错误**——OCCT 会按
102
+ * `det^(1/3)` 取等比因子近似(实测 z×2.5 被当成 1.357 倍等比缩放)。所以分类
103
+ * 判据既不能过严(把刚体旋转推给 GTrsf),也不能过宽(把非等比缩放塞给 Trsf)。
104
+ *
105
+ * @param kernel - L1 引擎句柄。
106
+ * @param solid - 输入实体(不被消费、不被释放;调用方保留其所有权)。
107
+ * @param m12 - 3×4 行主序矩阵(12 元素)。
108
+ * @returns 变换后的新实体(调用方负责释放)。
109
+ */
110
+ export declare function applyAffineBrep(kernel: BrepEngineApi, solid: BrepHandle, m12: readonly number[]): BrepHandle;
65
111
  /**
66
112
  * BREP 缩放:使用 OCCT transform(3x4 仿射矩阵)。
67
113
  *
68
114
  * 与 mesh 路径 scale(P6 §4.6)一致:
69
115
  * - factor 为 number(均匀缩放)或 Vec3 [sx, sy, sz](非均匀)
70
116
  * - center 为缩放不动点(p' = center + S·(p − center));缺省 [0,0,0](原点),
71
- * 与 vendored brepjs `scale(shape, factor, { center? })` 的默认一致。
117
+ * 与早期 brepjs `scale(shape, factor, { center? })` 的默认一致。
118
+ *
119
+ * 路径分派交给 {@link applyAffineBrep}:等比走 `transform`,非等比走
120
+ * `generalTransform`(gp_Trsf 表达不了非等比)。注意判据是**数值**相似性而非
121
+ * 因子逐分量相等——`[1, 1, 1+1e-9]` 这种数值上就是等比,归 `transform` 一侧。
72
122
  *
73
123
  * @param kernel OCCT 内核
74
124
  * @param solid 输入实体
@@ -294,6 +344,44 @@ export declare function loadBrep(kernel: BrepEngineApi, buffer: ArrayBuffer, bre
294
344
  shape: Shape;
295
345
  multiSolidCount?: number;
296
346
  };
347
+ /** 多零件 STEP 导入中的一个零件(几何 + solid 句柄 + 身份)。 */
348
+ export interface LoadBrepAssemblyPart {
349
+ /** 零件序号(0 起,DFS 声明序)。 */
350
+ index: number;
351
+ /** 零件名(XCAF label;无则回退 `imported:<index>`)。 */
352
+ name: string;
353
+ /** 显示色 sRGB 0..1,无则 null。 */
354
+ color: [number, number, number] | null;
355
+ /** 三角化显示 mesh。 */
356
+ shape: Shape;
357
+ /** OCCT solid 句柄(已烘 location;生命周期归 brepChain,调用方经 fromBrep 绑定)。 */
358
+ solid: BrepHandle;
359
+ }
360
+ /**
361
+ * BREP-native 多零件 STEP 导入(XCAF 装配树 → 逐零件 Shape + 装配层级)。
362
+ *
363
+ * 与 `loadBrep`(单零件收敛,§5.4 旧行为)对照:loadBrepAssembly 走
364
+ * `importAssemblyFromStep`(XCAF),返回**全部**叶零件(DFS 声明序)与装配树。
365
+ *
366
+ * - 装配树叶子 = 零件;合成节点(syntheticGroup:单一产品含多 MANIFOLD_SOLID_BREP)
367
+ * 如实表达为中间节点;
368
+ * - 无装配结构的单叶文件 → 1 个零件、无 assembly(行为与现状单零件一致);
369
+ * - 句柄互通(T0):`importAssemblyFromStep` 内部用 initOcctWasm() 全局单例内核,
370
+ * 与注入的 `BrepEngineApi`(createOcctPrimitives 包装同一单例)句柄数值互通——
371
+ * 探针见 test/brep/load-brep-assembly.test.ts;
372
+ * - 释放:装配节点句柄已由 walkLabel 释放,叶句柄随返回 parts 交给调用方
373
+ * (fromBrep 绑定后归 brepChain 管理,不在此释放)。
374
+ *
375
+ * @param kernel - the initialized OCCT kernel (L1 contract face).
376
+ * @param buffer - the raw STEP file bytes (text-encoded ArrayBuffer; stpz
377
+ * unzipping is the caller's job — faijs never unzips implicitly).
378
+ * @returns 全部零件 + 装配层级(多叶时)+ 叶数(>1 时)。
379
+ */
380
+ export declare function loadBrepAssembly(kernel: BrepEngineApi, buffer: ArrayBuffer): Promise<{
381
+ parts: LoadBrepAssemblyPart[];
382
+ assembly?: ImportAssemblyNode;
383
+ multiSolidCount?: number;
384
+ }>;
297
385
  /**
298
386
  * Convert a THREE.Matrix4 into the 3x4 row-major array (12 doubles) the OCCT
299
387
  * transform expects.
@@ -1 +1 @@
1
- {"version":3,"file":"brep-ops.d.ts","sourceRoot":"","sources":["../../src/brep/brep-ops.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brep-ops.d.ts","sourceRoot":"","sources":["../../src/brep/brep-ops.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,8 @@
19
19
  * 坐标系:Z-up、毫米,与 mesh 路径一致。
20
20
  */
21
21
  import * as THREE from 'three';
22
- import { getOcctKernel } from '../occt-kernel/occtKernel.js';
22
+ import { getOcctKernel, importAssemblyFromStep, collectLeafParts, } from '../occt-kernel/occtKernel.js';
23
+ import { getSolidColorsOrdered } from '../occt-kernel/stepColorParser.js';
23
24
  import { getSolidBoundingBox } from './brep-utils.js';
24
25
  import { DEFAULT_LINEAR_DEFLECTION } from '../tolerance.js';
25
26
  import { mm } from '../units.js';
@@ -89,13 +90,79 @@ export function rotateBrep(kernel, solid, angles, pivot) {
89
90
  }
90
91
  return kernel.transform(solid, matrixToArray(matrix));
91
92
  }
93
+ /**
94
+ * 判定 3×4 行主序仿射矩阵的线性部分是否为**相似变换**(旋转/反射 × 等比缩放)——
95
+ * 即 `gp_Trsf` 能精确承载、`kernel.transform`(BRepBuilderAPI_Transform)唯一
96
+ * 正确处理的那一类。
97
+ *
98
+ * 判据必须用**相对**容差,不能像 2026-10-07 之前那样用绝对容差:
99
+ * GOTCHA(2026-10-07,openscad example023 parity)——一个 60° 刚体旋转只要按
100
+ * 7 位小数打印(`0.8660254`),行范数就是 `0.99999999645`(与 1 相差 3.6e-9)。
101
+ * 绝对容差 1e-9 会判定 `|‖row2‖ − ‖row0‖| = 3.6e-9 > 1e-9` ⇒ 把这个**纯旋转**
102
+ * 判成"非相似",从而错误地走进 `generalTransform`;而 occt 侧 `gp_GTrsf` 路径在
103
+ * **已三角化**的形状上会重复计入被平移面的 TopLoc(顶盖 z 由 5 变 10,绕过在
104
+ * `occt-kernel/occt-primitives.ts` 的 `generalTransform` 适配层,本层不感知)。
105
+ * 相对容差 1e-6 覆盖 7 位小数打印精度,同时仍能区分真正的非等比缩放
106
+ * (如 z×2.5 行范数相差 2.5 倍)。正交性同用 1e-6:7 位小数打印的旋转,行点积
107
+ * 误差上界约 2e-7。
108
+ *
109
+ * @param m12 - 3×4 行主序矩阵(12 元素:`[r00,r01,r02,tx, r10,r11,r12,ty, r20,r21,r22,tz]`)。
110
+ * @returns `true` 当且仅当线性部分可逆且为相似变换。
111
+ */
112
+ export function isSimilarityAffine(m12) {
113
+ const s0 = Math.hypot(m12[0], m12[1], m12[2]);
114
+ const s1 = Math.hypot(m12[4], m12[5], m12[6]);
115
+ const s2 = Math.hypot(m12[8], m12[9], m12[10]);
116
+ if (!(s0 > 1e-12) || !(s1 > 1e-12) || !(s2 > 1e-12))
117
+ return false;
118
+ const REL = 1e-6;
119
+ if (Math.abs(s1 - s0) > REL * s0 || Math.abs(s2 - s0) > REL * s0)
120
+ return false;
121
+ const dot = (r, c) => m12[r * 4] * m12[c * 4] + m12[r * 4 + 1] * m12[c * 4 + 1] + m12[r * 4 + 2] * m12[c * 4 + 2];
122
+ return (Math.abs(dot(0, 1)) <= REL * s0 * s1 &&
123
+ Math.abs(dot(0, 2)) <= REL * s0 * s2 &&
124
+ Math.abs(dot(1, 2)) <= REL * s1 * s2);
125
+ }
126
+ /**
127
+ * 施加 3×4 行主序仿射矩阵,按矩阵类别选**唯一正确**的 OCCT 路径。
128
+ *
129
+ * 两条路径的差异是**正确性**而不只是性能:
130
+ * - 相似(旋转/反射 × 等比缩放)→ `kernel.transform`(BRepBuilderAPI_Transform)。
131
+ * - 其余(非等比缩放、错切)→ `kernel.generalTransform`(gp_GTrsf)。
132
+ *
133
+ * GOTCHA(2026-10-07):occt 的 `generalTransform` 在**已经三角化过**的形状上会
134
+ * 重复计入被平移面的 TopLoc(精确 z∈[0,5],网格顶盖却落在 z=10;非等比 z×2.5 时
135
+ * 12.5 vs 17.5)。该缺陷是 **occt 专属**(brepkit 的 GTrsf 路径干净),因此绕过
136
+ * **不在本层**——本层是引擎中立分派,让每个引擎都为 occt 的毛病多付一次句柄分配
137
+ * 是错的(还会扰动 brepkit 的 `cut` bbox,见 multi-engine-op-parity)。
138
+ * 绕过落在 occt 适配层:`occt-kernel/occt-primitives.ts` 的 `generalTransform`
139
+ * 先 `copy` 再变换。`kernel.transform` 无此问题,故相似矩阵不付这份深拷贝成本。
140
+ *
141
+ * 反向陷阱:把非相似矩阵交给 `kernel.transform` 是**静默错误**——OCCT 会按
142
+ * `det^(1/3)` 取等比因子近似(实测 z×2.5 被当成 1.357 倍等比缩放)。所以分类
143
+ * 判据既不能过严(把刚体旋转推给 GTrsf),也不能过宽(把非等比缩放塞给 Trsf)。
144
+ *
145
+ * @param kernel - L1 引擎句柄。
146
+ * @param solid - 输入实体(不被消费、不被释放;调用方保留其所有权)。
147
+ * @param m12 - 3×4 行主序矩阵(12 元素)。
148
+ * @returns 变换后的新实体(调用方负责释放)。
149
+ */
150
+ export function applyAffineBrep(kernel, solid, m12) {
151
+ if (isSimilarityAffine(m12))
152
+ return kernel.transform(solid, m12);
153
+ return kernel.generalTransform(solid, m12);
154
+ }
92
155
  /**
93
156
  * BREP 缩放:使用 OCCT transform(3x4 仿射矩阵)。
94
157
  *
95
158
  * 与 mesh 路径 scale(P6 §4.6)一致:
96
159
  * - factor 为 number(均匀缩放)或 Vec3 [sx, sy, sz](非均匀)
97
160
  * - center 为缩放不动点(p' = center + S·(p − center));缺省 [0,0,0](原点),
98
- * 与 vendored brepjs `scale(shape, factor, { center? })` 的默认一致。
161
+ * 与早期 brepjs `scale(shape, factor, { center? })` 的默认一致。
162
+ *
163
+ * 路径分派交给 {@link applyAffineBrep}:等比走 `transform`,非等比走
164
+ * `generalTransform`(gp_Trsf 表达不了非等比)。注意判据是**数值**相似性而非
165
+ * 因子逐分量相等——`[1, 1, 1+1e-9]` 这种数值上就是等比,归 `transform` 一侧。
99
166
  *
100
167
  * @param kernel OCCT 内核
101
168
  * @param solid 输入实体
@@ -113,13 +180,7 @@ export function scaleBrep(kernel, solid, factor, center) {
113
180
  .multiply(scale)
114
181
  .multiply(new THREE.Matrix4().makeTranslation(-center[0], -center[1], -center[2]))
115
182
  : scale;
116
- const isUniform = f[0] === f[1] && f[1] === f[2];
117
- // OCCT gp_Trsf (kernel.transform) only supports uniform scaling.
118
- // Non-uniform scaling requires gp_GTrsf (kernel.generalTransform).
119
- if (isUniform) {
120
- return kernel.transform(solid, matrixToArray(matrix));
121
- }
122
- return kernel.generalTransform(solid, matrixToArray(matrix));
183
+ return applyAffineBrep(kernel, solid, matrixToArray(matrix));
123
184
  }
124
185
  // ─── 装配变换 ───
125
186
  /**
@@ -328,9 +389,20 @@ export function splitBrep(kernel, solid, params) {
328
389
  const halfSpaceBox = kernel.transform(localBox, matrixToArray(finalMatrix));
329
390
  kernel.release(localBox);
330
391
  try {
331
- const front = kernel.common(solid, halfSpaceBox);
392
+ // P2(2026-10-06):规避 occt-wasm 在 Chrome worker 下 common 对"平面退化 BOP"
393
+ // 挂死(common(solid, 半边盒) 不稳定;cut 稳定——drill 打孔 cut 在 worker 正常)。
394
+ // 差集对偶:back(负侧)= solid - 正盒;front(正侧)= solid - 负盒。
395
+ // 数学等价于 common/cut(盒覆盖 solid 全尺寸,边界同为切割平面),node 探针验证
396
+ // 三角化结果与原实现一致。common 保留在 node/非 worker 环境的回退不可行——
397
+ // 静态行为应一致,故统一走两 cut。
332
398
  const back = kernel.cut(solid, halfSpaceBox);
399
+ // 负盒:local 系 z ∈ [-halfSize, 0],同 finalMatrix(平面沿 -normal 方向扩展)
400
+ const localBoxNeg = kernel.makeBoxFromCorners({ x: -halfSize, y: -halfSize, z: -halfSize }, { x: halfSize, y: halfSize, z: 0 });
401
+ const negBox = kernel.transform(localBoxNeg, matrixToArray(finalMatrix));
402
+ kernel.release(localBoxNeg);
403
+ const front = kernel.cut(solid, negBox);
333
404
  kernel.release(halfSpaceBox);
405
+ kernel.release(negBox);
334
406
  return { front, back };
335
407
  }
336
408
  catch (err) {
@@ -495,6 +567,30 @@ export function extrudeBrep(kernel, solid, params) {
495
567
  return result;
496
568
  }
497
569
  // ─── STEP/BREP 导入操作 ───
570
+ /**
571
+ * 单零件导入的 STEP 颜色挂载(P2,方案 §5 STEP 行)。
572
+ *
573
+ * `getSolidColorsOrdered`(stepColorParser)把 STYLED_ITEM → COLOUR_RGB 引用链
574
+ * 解析为按 MANIFOLD_SOLID_BREP 文件序的颜色数组;该序与 OCCT
575
+ * `getSubShapes(compound,'solid')` 一致(stepColorParser 注释),因此取 `[0]`
576
+ * 即「loadBrep 单零件收敛取第一个 solid」的颜色,语义对齐。
577
+ *
578
+ * 宽容兼容外部数据:BREP(CASCADE Topology 文本)无颜色概念直接跳过;STEP
579
+ * 文本无 `STYLED_ITEM` 早退(零额外开销);引用链缺失/未知预定义色返回 null,
580
+ * 一律不挂外观、不抛错(AGENTS.md 全局铁律:不得以内部严格性拒收正常文件)。
581
+ */
582
+ function applyFirstStepColor(shape, buffer) {
583
+ const head = new TextDecoder('utf-8').decode(buffer.slice(0, 64));
584
+ if (head.includes('CASCADE Topology'))
585
+ return shape;
586
+ const text = new TextDecoder('utf-8').decode(buffer);
587
+ if (!text.includes('STYLED_ITEM'))
588
+ return shape;
589
+ const c0 = getSolidColorsOrdered(text)[0];
590
+ if (c0)
591
+ shape.appearance = { color: [c0[0], c0[1], c0[2]] };
592
+ return shape;
593
+ }
498
594
  /**
499
595
  * BREP-native STEP 导入:使用 OCCT kernel.importStep 导入 STEP 文件为精确实体。
500
596
  *
@@ -548,7 +644,7 @@ export function loadBrep(kernel, buffer, brepChain, stmtId, opts) {
548
644
  // failed"),调用方必须自己保证它只流向变换/聚合。
549
645
  if (opts?.allowNonSolid && hasAnyTopology(kernel, top)) {
550
646
  const shape = solidToShape(kernel, top, undefined, brepChain, stmtId);
551
- return { solid: top, shape };
647
+ return { solid: top, shape: applyFirstStepColor(shape, buffer) };
552
648
  }
553
649
  kernel.release(top);
554
650
  throw new Error(`[loadBrep] imported shape contains no solid sub-shapes ` +
@@ -560,7 +656,7 @@ export function loadBrep(kernel, buffer, brepChain, stmtId, opts) {
560
656
  const realSolid = solids[0];
561
657
  kernel.release(top); // 释放 Compound 包裹,realSolid 独立持有
562
658
  const shape = solidToShape(kernel, realSolid, undefined, brepChain, stmtId);
563
- return { solid: realSolid, shape };
659
+ return { solid: realSolid, shape: applyFirstStepColor(shape, buffer) };
564
660
  }
565
661
  // 多 solid(§5.4 单零件收敛):只支持单零件 —— 降级取**第一个** solid,
566
662
  // 返回单一非复合 Shape,并回传 multiSolidCount(≥2 表示本文件被降级取件,
@@ -582,7 +678,7 @@ export function loadBrep(kernel, buffer, brepChain, stmtId, opts) {
582
678
  }
583
679
  kernel.release(top); // 释放 Compound 包裹,first 独立持有(同单 solid 模式)
584
680
  const shape = solidToShape(kernel, first, undefined, brepChain, stmtId);
585
- return { solid: first, shape, multiSolidCount: solids.length };
681
+ return { solid: first, shape: applyFirstStepColor(shape, buffer), multiSolidCount: solids.length };
586
682
  }
587
683
  /** Sub-shape kinds that make an imported shape "addressable but not a solid". */
588
684
  const NON_SOLID_KINDS = ['vertex', 'edge', 'wire', 'face', 'shell'];
@@ -600,6 +696,101 @@ const NON_SOLID_KINDS = ['vertex', 'edge', 'wire', 'face', 'shell'];
600
696
  function hasAnyTopology(kernel, top) {
601
697
  return NON_SOLID_KINDS.some((kind) => kernel.getSubShapes(top, kind).length > 0);
602
698
  }
699
+ /**
700
+ * BREP-native 多零件 STEP 导入(XCAF 装配树 → 逐零件 Shape + 装配层级)。
701
+ *
702
+ * 与 `loadBrep`(单零件收敛,§5.4 旧行为)对照:loadBrepAssembly 走
703
+ * `importAssemblyFromStep`(XCAF),返回**全部**叶零件(DFS 声明序)与装配树。
704
+ *
705
+ * - 装配树叶子 = 零件;合成节点(syntheticGroup:单一产品含多 MANIFOLD_SOLID_BREP)
706
+ * 如实表达为中间节点;
707
+ * - 无装配结构的单叶文件 → 1 个零件、无 assembly(行为与现状单零件一致);
708
+ * - 句柄互通(T0):`importAssemblyFromStep` 内部用 initOcctWasm() 全局单例内核,
709
+ * 与注入的 `BrepEngineApi`(createOcctPrimitives 包装同一单例)句柄数值互通——
710
+ * 探针见 test/brep/load-brep-assembly.test.ts;
711
+ * - 释放:装配节点句柄已由 walkLabel 释放,叶句柄随返回 parts 交给调用方
712
+ * (fromBrep 绑定后归 brepChain 管理,不在此释放)。
713
+ *
714
+ * @param kernel - the initialized OCCT kernel (L1 contract face).
715
+ * @param buffer - the raw STEP file bytes (text-encoded ArrayBuffer; stpz
716
+ * unzipping is the caller's job — faijs never unzips implicitly).
717
+ * @returns 全部零件 + 装配层级(多叶时)+ 叶数(>1 时)。
718
+ */
719
+ export async function loadBrepAssembly(kernel, buffer) {
720
+ const nodes = await importAssemblyFromStep(buffer);
721
+ const leaves = collectLeafParts(nodes);
722
+ // DFS 声明序:leaf 序 = parts 序 = ImportModel.parts.index。
723
+ // 实体校验(与 load op「要求导入物含实体」契约一致):leaf 必须持有实体
724
+ // (自身是 solid,或 label 内含 solid);空 label / wireframe 零件跳过,
725
+ // 全部跳过则报错(不静默回退)。parts 下标保持连续(0..N-1)。
726
+ const leafIndex = new Map();
727
+ const parts = [];
728
+ for (const leaf of leaves) {
729
+ if (!leaf.shapeHandle || !leafHasSolid(kernel, leaf.shapeHandle))
730
+ continue;
731
+ const idx = parts.length;
732
+ leafIndex.set(leaf, idx);
733
+ const h = leaf.shapeHandle;
734
+ parts.push({
735
+ index: idx,
736
+ name: leaf.name || `imported:${idx}`,
737
+ color: leaf.color,
738
+ shape: solidToShape(kernel, h),
739
+ solid: h,
740
+ });
741
+ }
742
+ // 无叶零件(空/异常/纯 wireframe 文件)→ 报错暴露(不静默回退)。
743
+ if (parts.length === 0) {
744
+ throw new Error('[loadBrepAssembly] imported STEP contains no solid leaf parts');
745
+ }
746
+ const assembly = toImportAssemblyNode(nodes, leafIndex);
747
+ return {
748
+ parts,
749
+ ...(assembly ? { assembly } : {}),
750
+ ...(parts.length > 1 ? { multiSolidCount: parts.length } : {}),
751
+ };
752
+ }
753
+ /**
754
+ * leaf 是否持有实体(loadBrepAssembly 实体校验):自身是 solid(syntheticGroup
755
+ * 拆出的单个 solid 句柄),或 label compound 内含 solid。getSubShapes 的引用
756
+ * 句柄须立即 release(walkLabel 只释放了它自己取的副本)。
757
+ */
758
+ function leafHasSolid(kernel, h) {
759
+ const bh = h;
760
+ if (kernel.isSolid(bh))
761
+ return true;
762
+ const solids = kernel.getSubShapes(bh, 'solid');
763
+ const n = solids.length;
764
+ for (const s of solids)
765
+ kernel.release(s);
766
+ return n > 0;
767
+ }
768
+ /**
769
+ * XCAF 装配树 → ImportAssemblyNode(DFS 序与 parts 一致)。
770
+ *
771
+ * - 单根且根为叶(无装配结构)→ undefined(单零件路径,与现状一致);
772
+ * - 单根装配 → 该根;
773
+ * - 多根 → 合成虚拟根 `{ name: 'imported' }`(确定性结构名,非零件身份)。
774
+ */
775
+ function toImportAssemblyNode(nodes, leafIndex) {
776
+ if (nodes.length === 0)
777
+ return undefined;
778
+ const convert = (node) => {
779
+ if (node.children.length === 0) {
780
+ const idx = leafIndex.get(node);
781
+ return { name: node.name, ...(idx !== undefined ? { partIndex: idx } : {}) };
782
+ }
783
+ return { name: node.name, children: node.children.map(convert) };
784
+ };
785
+ if (nodes.length === 1) {
786
+ const root = convert(nodes[0]);
787
+ // 单根且根为叶(无装配结构)→ 不表达装配层级
788
+ if (root.partIndex !== undefined)
789
+ return undefined;
790
+ return root;
791
+ }
792
+ return { name: 'imported', children: nodes.map(convert) };
793
+ }
603
794
  // ─── 辅助函数 ───
604
795
  /**
605
796
  * Convert a THREE.Matrix4 into the 3x4 row-major array (12 doubles) the OCCT