@faicad/faijs 0.29.5 → 0.30.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (582) hide show
  1. package/NOTICE +6 -5
  2. package/dist/api/api-namespace.d.ts +1 -1
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +53 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/appearance.d.ts +0 -2
  7. package/dist/api/appearance.d.ts.map +1 -1
  8. package/dist/api/appearance.js +0 -2
  9. package/dist/api/appearance.js.map +1 -1
  10. package/dist/api/assembly/entities.d.ts +1 -1
  11. package/dist/api/assembly/entities.js +1 -1
  12. package/dist/api/assembly/entities.js.map +1 -1
  13. package/dist/api/assembly/index.d.ts +1 -1
  14. package/dist/api/assembly/index.js +1 -1
  15. package/dist/api/assembly/index.js.map +1 -1
  16. package/dist/api/assembly/joints.d.ts +33 -15
  17. package/dist/api/assembly/joints.d.ts.map +1 -1
  18. package/dist/api/assembly/joints.js +31 -13
  19. package/dist/api/assembly/joints.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.js +1 -1
  22. package/dist/api/assembly/preview.js.map +1 -1
  23. package/dist/api/assembly/solve.d.ts +1 -1
  24. package/dist/api/assembly/solve.js +1 -1
  25. package/dist/api/assembly/solve.js.map +1 -1
  26. package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.js +1 -1
  28. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  29. package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
  30. package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
  31. package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
  32. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  33. package/dist/api/assembly/solvers/global-solver.js +3 -4
  34. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  35. package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
  36. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
  37. package/dist/api/assembly/solvers/linalg.d.ts +2 -2
  38. package/dist/api/assembly/solvers/linalg.js +2 -2
  39. package/dist/api/assembly/solvers/linalg.js.map +1 -1
  40. package/dist/api/assembly/solvers/types.d.ts +2 -5
  41. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  42. package/dist/api/assembly/solvers/types.js +1 -4
  43. package/dist/api/assembly/solvers/types.js.map +1 -1
  44. package/dist/api/boolean.d.ts.map +1 -1
  45. package/dist/api/boolean.js +7 -6
  46. package/dist/api/boolean.js.map +1 -1
  47. package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
  48. package/dist/api/brep-mirror/booleanFns.js +5 -5
  49. package/dist/api/brep-mirror/booleanFns.js.map +1 -1
  50. package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
  51. package/dist/api/brep-mirror/compoundFns.js +4 -4
  52. package/dist/api/brep-mirror/compoundFns.js.map +1 -1
  53. package/dist/api/brep-mirror/healingFns.d.ts +4 -4
  54. package/dist/api/brep-mirror/healingFns.js +4 -4
  55. package/dist/api/brep-mirror/healingFns.js.map +1 -1
  56. package/dist/api/brep-mirror/hullFns.d.ts +2 -2
  57. package/dist/api/brep-mirror/hullFns.js +2 -2
  58. package/dist/api/brep-mirror/hullFns.js.map +1 -1
  59. package/dist/api/brep-mirror/patternFns.d.ts +5 -5
  60. package/dist/api/brep-mirror/patternFns.js +10 -10
  61. package/dist/api/brep-mirror/patternFns.js.map +1 -1
  62. package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
  63. package/dist/api/brep-mirror/primitiveFns.js +4 -4
  64. package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
  65. package/dist/api/brep-mirror/roofFns.d.ts +3 -3
  66. package/dist/api/brep-mirror/roofFns.js +7 -7
  67. package/dist/api/brep-mirror/roofFns.js.map +1 -1
  68. package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
  69. package/dist/api/brep-mirror/sweepFns.js +14 -14
  70. package/dist/api/brep-mirror/sweepFns.js.map +1 -1
  71. package/dist/api/brep-mirror/threadFns.d.ts +1 -1
  72. package/dist/api/brep-mirror/threadFns.js +1 -1
  73. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  74. package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
  75. package/dist/api/brep-mirror/topologyFns.js +8 -8
  76. package/dist/api/brep-mirror/topologyFns.js.map +1 -1
  77. package/dist/api/brep-operations/booleanFns.d.ts +40 -0
  78. package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
  79. package/dist/api/brep-operations/booleanFns.js +104 -0
  80. package/dist/api/brep-operations/booleanFns.js.map +1 -0
  81. package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
  82. package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
  83. package/dist/api/brep-operations/brepHelpers.js +131 -0
  84. package/dist/api/brep-operations/brepHelpers.js.map +1 -0
  85. package/dist/api/brep-operations/compoundFns.d.ts +46 -0
  86. package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
  87. package/dist/api/brep-operations/compoundFns.js +299 -0
  88. package/dist/api/brep-operations/compoundFns.js.map +1 -0
  89. package/dist/api/brep-operations/healingFns.d.ts +78 -0
  90. package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
  91. package/dist/api/brep-operations/healingFns.js +294 -0
  92. package/dist/api/brep-operations/healingFns.js.map +1 -0
  93. package/dist/api/brep-operations/hullFns.d.ts +20 -0
  94. package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
  95. package/dist/api/brep-operations/hullFns.js +46 -0
  96. package/dist/api/brep-operations/hullFns.js.map +1 -0
  97. package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
  98. package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
  99. package/dist/api/brep-operations/joinery-brep.js +463 -0
  100. package/dist/api/brep-operations/joinery-brep.js.map +1 -0
  101. package/dist/api/brep-operations/patternFns.d.ts +43 -0
  102. package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
  103. package/dist/api/brep-operations/patternFns.js +178 -0
  104. package/dist/api/brep-operations/patternFns.js.map +1 -0
  105. package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
  106. package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
  107. package/dist/api/brep-operations/primitiveFns.js +104 -0
  108. package/dist/api/brep-operations/primitiveFns.js.map +1 -0
  109. package/dist/api/brep-operations/roofFns.d.ts +24 -0
  110. package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
  111. package/dist/api/brep-operations/roofFns.js +229 -0
  112. package/dist/api/brep-operations/roofFns.js.map +1 -0
  113. package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
  114. package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
  115. package/dist/api/brep-operations/straightSkeleton.js +431 -0
  116. package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
  117. package/dist/api/brep-operations/sweepFns.d.ts +60 -0
  118. package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
  119. package/dist/api/brep-operations/sweepFns.js +323 -0
  120. package/dist/api/brep-operations/sweepFns.js.map +1 -0
  121. package/dist/api/brep-operations/threadFns.d.ts +83 -0
  122. package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
  123. package/dist/api/brep-operations/threadFns.js +138 -0
  124. package/dist/api/brep-operations/threadFns.js.map +1 -0
  125. package/dist/api/brep-operations/topologyFns.d.ts +90 -0
  126. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
  127. package/dist/api/brep-operations/topologyFns.js +276 -0
  128. package/dist/api/brep-operations/topologyFns.js.map +1 -0
  129. package/dist/api/brep-topology.d.ts +1 -1
  130. package/dist/api/brep-topology.d.ts.map +1 -1
  131. package/dist/api/brep-topology.js +1 -1
  132. package/dist/api/brep-topology.js.map +1 -1
  133. package/dist/api/brepjs-compat/index.d.ts +1 -1
  134. package/dist/api/brepjs-compat/index.js +3 -3
  135. package/dist/api/brepjs-compat/index.js.map +1 -1
  136. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
  137. package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
  138. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
  139. package/dist/api/curve-sketch/index.d.ts +235 -0
  140. package/dist/api/curve-sketch/index.d.ts.map +1 -0
  141. package/dist/api/curve-sketch/index.js +487 -0
  142. package/dist/api/curve-sketch/index.js.map +1 -0
  143. package/dist/api/engrave.d.ts.map +1 -1
  144. package/dist/api/engrave.js +3 -2
  145. package/dist/api/engrave.js.map +1 -1
  146. package/dist/api/export-brep.d.ts +41 -0
  147. package/dist/api/export-brep.d.ts.map +1 -0
  148. package/dist/api/export-brep.js +58 -0
  149. package/dist/api/export-brep.js.map +1 -0
  150. package/dist/api/export-stl.d.ts +50 -0
  151. package/dist/api/export-stl.d.ts.map +1 -0
  152. package/dist/api/export-stl.js +99 -0
  153. package/dist/api/export-stl.js.map +1 -0
  154. package/dist/api/extrude.d.ts +8 -11
  155. package/dist/api/extrude.d.ts.map +1 -1
  156. package/dist/api/extrude.js +11 -14
  157. package/dist/api/extrude.js.map +1 -1
  158. package/dist/api/fillet-variable.d.ts +2 -2
  159. package/dist/api/fillet-variable.js +2 -2
  160. package/dist/api/fillet-variable.js.map +1 -1
  161. package/dist/api/fillet.d.ts +2 -4
  162. package/dist/api/fillet.d.ts.map +1 -1
  163. package/dist/api/fillet.js +2 -4
  164. package/dist/api/fillet.js.map +1 -1
  165. package/dist/api/generated/2d.d.ts +4 -0
  166. package/dist/api/generated/2d.d.ts.map +1 -1
  167. package/dist/api/generated/2d.js +4 -0
  168. package/dist/api/generated/2d.js.map +1 -1
  169. package/dist/api/generated/core.d.ts +4 -0
  170. package/dist/api/generated/core.d.ts.map +1 -1
  171. package/dist/api/generated/core.js +4 -0
  172. package/dist/api/generated/core.js.map +1 -1
  173. package/dist/api/generated/gear.d.ts +4 -0
  174. package/dist/api/generated/gear.d.ts.map +1 -1
  175. package/dist/api/generated/gear.js +4 -0
  176. package/dist/api/generated/gear.js.map +1 -1
  177. package/dist/api/generated/io.d.ts +4 -0
  178. package/dist/api/generated/io.d.ts.map +1 -1
  179. package/dist/api/generated/io.js +4 -0
  180. package/dist/api/generated/io.js.map +1 -1
  181. package/dist/api/generated/kernel.d.ts +4 -0
  182. package/dist/api/generated/kernel.d.ts.map +1 -1
  183. package/dist/api/generated/kernel.js +4 -0
  184. package/dist/api/generated/kernel.js.map +1 -1
  185. package/dist/api/generated/measurement.d.ts +21 -21
  186. package/dist/api/generated/measurement.d.ts.map +1 -1
  187. package/dist/api/generated/measurement.js +25 -21
  188. package/dist/api/generated/measurement.js.map +1 -1
  189. package/dist/api/generated/ns.d.ts +4 -0
  190. package/dist/api/generated/ns.d.ts.map +1 -1
  191. package/dist/api/generated/ns.js +4 -0
  192. package/dist/api/generated/ns.js.map +1 -1
  193. package/dist/api/generated/operations.d.ts +32 -32
  194. package/dist/api/generated/operations.d.ts.map +1 -1
  195. package/dist/api/generated/operations.js +52 -48
  196. package/dist/api/generated/operations.js.map +1 -1
  197. package/dist/api/generated/projection.d.ts +4 -0
  198. package/dist/api/generated/projection.d.ts.map +1 -1
  199. package/dist/api/generated/projection.js +4 -0
  200. package/dist/api/generated/projection.js.map +1 -1
  201. package/dist/api/generated/query.d.ts +4 -0
  202. package/dist/api/generated/query.d.ts.map +1 -1
  203. package/dist/api/generated/query.js +4 -0
  204. package/dist/api/generated/query.js.map +1 -1
  205. package/dist/api/generated/sketching.d.ts +2 -2
  206. package/dist/api/generated/sketching.d.ts.map +1 -1
  207. package/dist/api/generated/sketching.js +7 -3
  208. package/dist/api/generated/sketching.js.map +1 -1
  209. package/dist/api/generated/text.d.ts +4 -0
  210. package/dist/api/generated/text.d.ts.map +1 -1
  211. package/dist/api/generated/text.js +4 -0
  212. package/dist/api/generated/text.js.map +1 -1
  213. package/dist/api/generated/topology.d.ts +45 -45
  214. package/dist/api/generated/topology.d.ts.map +1 -1
  215. package/dist/api/generated/topology.js +67 -63
  216. package/dist/api/generated/topology.js.map +1 -1
  217. package/dist/api/generated/view.d.ts +4 -0
  218. package/dist/api/generated/view.d.ts.map +1 -1
  219. package/dist/api/generated/view.js +4 -0
  220. package/dist/api/generated/view.js.map +1 -1
  221. package/dist/api/geom-types/constants.d.ts +11 -0
  222. package/dist/api/geom-types/constants.d.ts.map +1 -0
  223. package/dist/api/geom-types/constants.js +11 -0
  224. package/dist/api/geom-types/constants.js.map +1 -0
  225. package/dist/api/geom-types/index.d.ts +21 -0
  226. package/dist/api/geom-types/index.d.ts.map +1 -0
  227. package/dist/api/geom-types/index.js +22 -0
  228. package/dist/api/geom-types/index.js.map +1 -0
  229. package/dist/api/geom-types/planeOps.d.ts +98 -0
  230. package/dist/api/geom-types/planeOps.d.ts.map +1 -0
  231. package/dist/api/geom-types/planeOps.js +170 -0
  232. package/dist/api/geom-types/planeOps.js.map +1 -0
  233. package/dist/api/geom-types/planeTypes.d.ts +24 -0
  234. package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
  235. package/dist/api/geom-types/planeTypes.js +8 -0
  236. package/dist/api/geom-types/planeTypes.js.map +1 -0
  237. package/dist/api/geom-types/types.d.ts +64 -0
  238. package/dist/api/geom-types/types.d.ts.map +1 -0
  239. package/dist/api/geom-types/types.js +48 -0
  240. package/dist/api/geom-types/types.js.map +1 -0
  241. package/dist/api/geom-types/vecOps.d.ts +124 -0
  242. package/dist/api/geom-types/vecOps.d.ts.map +1 -0
  243. package/dist/api/geom-types/vecOps.js +202 -0
  244. package/dist/api/geom-types/vecOps.js.map +1 -0
  245. package/dist/api/geom.d.ts.map +1 -1
  246. package/dist/api/geom.js +6 -5
  247. package/dist/api/geom.js.map +1 -1
  248. package/dist/api/half-space.d.ts +56 -0
  249. package/dist/api/half-space.d.ts.map +1 -0
  250. package/dist/api/half-space.js +82 -0
  251. package/dist/api/half-space.js.map +1 -0
  252. package/dist/api/helix.d.ts +10 -1
  253. package/dist/api/helix.d.ts.map +1 -1
  254. package/dist/api/helix.js +19 -3
  255. package/dist/api/helix.js.map +1 -1
  256. package/dist/api/index.d.ts +15 -6
  257. package/dist/api/index.d.ts.map +1 -1
  258. package/dist/api/index.js +29 -8
  259. package/dist/api/index.js.map +1 -1
  260. package/dist/api/internal/compat-op.d.ts +4 -30
  261. package/dist/api/internal/compat-op.d.ts.map +1 -1
  262. package/dist/api/internal/compat-op.js +10 -42
  263. package/dist/api/internal/compat-op.js.map +1 -1
  264. package/dist/api/internal/compat-projection.d.ts +5 -5
  265. package/dist/api/internal/compat-projection.js +5 -5
  266. package/dist/api/internal/compat-projection.js.map +1 -1
  267. package/dist/api/internal/dual-form-args.d.ts +0 -2
  268. package/dist/api/internal/dual-form-args.d.ts.map +1 -1
  269. package/dist/api/internal/dual-form-args.js +1 -3
  270. package/dist/api/internal/dual-form-args.js.map +1 -1
  271. package/dist/api/internal/l3-bridge.d.ts +5 -37
  272. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  273. package/dist/api/internal/l3-bridge.js +7 -76
  274. package/dist/api/internal/l3-bridge.js.map +1 -1
  275. package/dist/api/internal/profile-wire.d.ts +1 -1
  276. package/dist/api/internal/profile-wire.js +1 -1
  277. package/dist/api/internal/profile-wire.js.map +1 -1
  278. package/dist/api/internal/result-unwrap.d.ts +4 -6
  279. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  280. package/dist/api/internal/result-unwrap.js +4 -6
  281. package/dist/api/internal/result-unwrap.js.map +1 -1
  282. package/dist/api/knurl.d.ts.map +1 -1
  283. package/dist/api/knurl.js +5 -3
  284. package/dist/api/knurl.js.map +1 -1
  285. package/dist/api/loft.d.ts +2 -2
  286. package/dist/api/loft.d.ts.map +1 -1
  287. package/dist/api/loft.js +2 -2
  288. package/dist/api/loft.js.map +1 -1
  289. package/dist/api/measurement/index.d.ts +3 -3
  290. package/dist/api/measurement/index.js +3 -3
  291. package/dist/api/measurement/index.js.map +1 -1
  292. package/dist/api/meta.d.ts +0 -2
  293. package/dist/api/meta.d.ts.map +1 -1
  294. package/dist/api/meta.js +0 -2
  295. package/dist/api/meta.js.map +1 -1
  296. package/dist/api/offset2d.d.ts +49 -0
  297. package/dist/api/offset2d.d.ts.map +1 -0
  298. package/dist/api/offset2d.js +86 -0
  299. package/dist/api/offset2d.js.map +1 -0
  300. package/dist/api/pattern.js +3 -3
  301. package/dist/api/pattern.js.map +1 -1
  302. package/dist/api/primitives.d.ts.map +1 -1
  303. package/dist/api/primitives.js +7 -6
  304. package/dist/api/primitives.js.map +1 -1
  305. package/dist/api/replicate.d.ts +2 -2
  306. package/dist/api/replicate.d.ts.map +1 -1
  307. package/dist/api/replicate.js +12 -12
  308. package/dist/api/replicate.js.map +1 -1
  309. package/dist/api/result.d.ts +1 -1
  310. package/dist/api/result.js +1 -1
  311. package/dist/api/result.js.map +1 -1
  312. package/dist/api/revolve.d.ts +2 -2
  313. package/dist/api/revolve.js +3 -3
  314. package/dist/api/revolve.js.map +1 -1
  315. package/dist/api/screw.d.ts +1 -1
  316. package/dist/api/screw.d.ts.map +1 -1
  317. package/dist/api/screw.js +5 -4
  318. package/dist/api/screw.js.map +1 -1
  319. package/dist/api/sdf.d.ts.map +1 -1
  320. package/dist/api/sdf.js +3 -2
  321. package/dist/api/sdf.js.map +1 -1
  322. package/dist/api/shape-type/index.d.ts +141 -0
  323. package/dist/api/shape-type/index.d.ts.map +1 -0
  324. package/dist/api/shape-type/index.js +182 -0
  325. package/dist/api/shape-type/index.js.map +1 -0
  326. package/dist/api/shell.d.ts +2 -2
  327. package/dist/api/shell.js +2 -2
  328. package/dist/api/shell.js.map +1 -1
  329. package/dist/api/solid-from-faces.d.ts +45 -0
  330. package/dist/api/solid-from-faces.d.ts.map +1 -0
  331. package/dist/api/solid-from-faces.js +72 -0
  332. package/dist/api/solid-from-faces.js.map +1 -0
  333. package/dist/api/solid-offset/index.d.ts +67 -0
  334. package/dist/api/solid-offset/index.d.ts.map +1 -0
  335. package/dist/api/solid-offset/index.js +132 -0
  336. package/dist/api/solid-offset/index.js.map +1 -0
  337. package/dist/api/surface/arg-spec.d.ts +35 -33
  338. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  339. package/dist/api/surface/arg-spec.js +222 -224
  340. package/dist/api/surface/arg-spec.js.map +1 -1
  341. package/dist/api/surface-face/index.d.ts +104 -0
  342. package/dist/api/surface-face/index.d.ts.map +1 -0
  343. package/dist/api/surface-face/index.js +217 -0
  344. package/dist/api/surface-face/index.js.map +1 -0
  345. package/dist/api/surface.d.ts +44 -0
  346. package/dist/api/surface.d.ts.map +1 -0
  347. package/dist/api/surface.js +66 -0
  348. package/dist/api/surface.js.map +1 -0
  349. package/dist/api/sweep.d.ts +59 -9
  350. package/dist/api/sweep.d.ts.map +1 -1
  351. package/dist/api/sweep.js +11 -6
  352. package/dist/api/sweep.js.map +1 -1
  353. package/dist/api/thicken.d.ts +1 -1
  354. package/dist/api/thicken.js +1 -1
  355. package/dist/api/thicken.js.map +1 -1
  356. package/dist/api/transform.d.ts +5 -5
  357. package/dist/api/transform.d.ts.map +1 -1
  358. package/dist/api/transform.js +11 -10
  359. package/dist/api/transform.js.map +1 -1
  360. package/dist/api/view/cameraFns.d.ts +1 -1
  361. package/dist/api/view/cameraFns.d.ts.map +1 -1
  362. package/dist/api/view/cameraFns.js +1 -1
  363. package/dist/api/view/cameraFns.js.map +1 -1
  364. package/dist/api/view/index.d.ts +0 -2
  365. package/dist/api/view/index.d.ts.map +1 -1
  366. package/dist/api/view/index.js +0 -2
  367. package/dist/api/view/index.js.map +1 -1
  368. package/dist/api/view/projectionPlanes.d.ts +1 -1
  369. package/dist/api/view/projectionPlanes.d.ts.map +1 -1
  370. package/dist/api/view/projectionPlanes.js.map +1 -1
  371. package/dist/api/view/view-camera.d.ts +7 -9
  372. package/dist/api/view/view-camera.d.ts.map +1 -1
  373. package/dist/api/view/view-camera.js +4 -6
  374. package/dist/api/view/view-camera.js.map +1 -1
  375. package/dist/api/view/view-projection.d.ts +0 -2
  376. package/dist/api/view/view-projection.d.ts.map +1 -1
  377. package/dist/api/view/view-projection.js +0 -2
  378. package/dist/api/view/view-projection.js.map +1 -1
  379. package/dist/api/view/view-sheet.d.ts +0 -2
  380. package/dist/api/view/view-sheet.d.ts.map +1 -1
  381. package/dist/api/view/view-sheet.js +0 -2
  382. package/dist/api/view/view-sheet.js.map +1 -1
  383. package/dist/api/view-export/index.d.ts +97 -0
  384. package/dist/api/view-export/index.d.ts.map +1 -0
  385. package/dist/api/view-export/index.js +118 -0
  386. package/dist/api/view-export/index.js.map +1 -0
  387. package/dist/brep/brep-ops.d.ts +89 -1
  388. package/dist/brep/brep-ops.d.ts.map +1 -1
  389. package/dist/brep/brep-ops.js +176 -10
  390. package/dist/brep/brep-ops.js.map +1 -1
  391. package/dist/brep/brep-topology.d.ts +20 -0
  392. package/dist/brep/brep-topology.d.ts.map +1 -1
  393. package/dist/brep/brep-topology.js +46 -0
  394. package/dist/brep/brep-topology.js.map +1 -1
  395. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  396. package/dist/brep/engine/adapters/occt.js +7 -7
  397. package/dist/brep/engine/adapters/occt.js.map +1 -1
  398. package/dist/brep/engine/primitives.d.ts +2 -3
  399. package/dist/brep/engine/primitives.d.ts.map +1 -1
  400. package/dist/brep/engine/primitives.js +1 -2
  401. package/dist/brep/engine/primitives.js.map +1 -1
  402. package/dist/brep/engine/registry.d.ts +1 -1
  403. package/dist/brep/engine/registry.js +1 -1
  404. package/dist/brep/engine/registry.js.map +1 -1
  405. package/dist/brep/engine/types.d.ts +2 -2
  406. package/dist/brep/engine/types.js.map +1 -1
  407. package/dist/brep/handle-bridge.d.ts +2 -2
  408. package/dist/brep/handle-bridge.js +2 -2
  409. package/dist/brep/handle-bridge.js.map +1 -1
  410. package/dist/brep/index.d.ts +6 -3
  411. package/dist/brep/index.d.ts.map +1 -1
  412. package/dist/brep/index.js +6 -3
  413. package/dist/brep/index.js.map +1 -1
  414. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  415. package/dist/brepkit-kernel/brepkitKernel.js +2 -2
  416. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  417. package/dist/browser.d.ts +2 -2
  418. package/dist/browser.d.ts.map +1 -1
  419. package/dist/browser.js +5 -4
  420. package/dist/browser.js.map +1 -1
  421. package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
  422. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  423. package/dist/cad-runtime/admit-compat-lib.js +3 -9
  424. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  425. package/dist/cad-runtime/backend-dispatch.js +12 -3
  426. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  427. package/dist/cad-runtime/direct-executor.d.ts +6 -3
  428. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  429. package/dist/cad-runtime/direct-executor.js +31 -9
  430. package/dist/cad-runtime/direct-executor.js.map +1 -1
  431. package/dist/cad-runtime/interp/env.d.ts +1 -1
  432. package/dist/cad-runtime/interp/env.js.map +1 -1
  433. package/dist/cad-runtime/lib-id.d.ts +0 -2
  434. package/dist/cad-runtime/lib-id.d.ts.map +1 -1
  435. package/dist/cad-runtime/lib-id.js +0 -2
  436. package/dist/cad-runtime/lib-id.js.map +1 -1
  437. package/dist/cad-runtime/live-shapes.d.ts +3 -5
  438. package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
  439. package/dist/cad-runtime/live-shapes.js +8 -10
  440. package/dist/cad-runtime/live-shapes.js.map +1 -1
  441. package/dist/cad-runtime/ports.d.ts +3 -3
  442. package/dist/cad-runtime/ports.js.map +1 -1
  443. package/dist/cad-runtime/runtime.d.ts +21 -7
  444. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  445. package/dist/cad-runtime/runtime.js +45 -6
  446. package/dist/cad-runtime/runtime.js.map +1 -1
  447. package/dist/define-op.d.ts +4 -3
  448. package/dist/define-op.d.ts.map +1 -1
  449. package/dist/define-op.js +2 -2
  450. package/dist/define-op.js.map +1 -1
  451. package/dist/geometry2d/bridge/plane.d.ts +1 -1
  452. package/dist/geometry2d/bridge/plane.js +1 -1
  453. package/dist/geometry2d/bridge/plane.js.map +1 -1
  454. package/dist/geometry2d/curve2d.d.ts +1 -1
  455. package/dist/geometry2d/curve2d.js +1 -1
  456. package/dist/geometry2d/curve2d.js.map +1 -1
  457. package/dist/index.d.ts +1 -1
  458. package/dist/index.d.ts.map +1 -1
  459. package/dist/index.js +10 -4
  460. package/dist/index.js.map +1 -1
  461. package/dist/io/fai-zip/container-read.d.ts +16 -0
  462. package/dist/io/fai-zip/container-read.d.ts.map +1 -1
  463. package/dist/io/fai-zip/container-read.js +22 -0
  464. package/dist/io/fai-zip/container-read.js.map +1 -1
  465. package/dist/io/fai-zip/index.d.ts +1 -1
  466. package/dist/io/fai-zip/index.d.ts.map +1 -1
  467. package/dist/io/fai-zip/index.js +1 -1
  468. package/dist/io/fai-zip/index.js.map +1 -1
  469. package/dist/lang/code-to-args.d.ts.map +1 -1
  470. package/dist/lang/code-to-args.js +10 -1
  471. package/dist/lang/code-to-args.js.map +1 -1
  472. package/dist/lang/determinism-scanner.d.ts.map +1 -1
  473. package/dist/lang/determinism-scanner.js +22 -9
  474. package/dist/lang/determinism-scanner.js.map +1 -1
  475. package/dist/lang/metadata-extractor.d.ts +27 -6
  476. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  477. package/dist/lang/metadata-extractor.js +88 -8
  478. package/dist/lang/metadata-extractor.js.map +1 -1
  479. package/dist/lang/parse-error.d.ts +4 -0
  480. package/dist/lang/parse-error.d.ts.map +1 -1
  481. package/dist/lang/parse-error.js.map +1 -1
  482. package/dist/lang/security-scanner.d.ts +27 -2
  483. package/dist/lang/security-scanner.d.ts.map +1 -1
  484. package/dist/lang/security-scanner.js +29 -2
  485. package/dist/lang/security-scanner.js.map +1 -1
  486. package/dist/lang/source-edit.d.ts +2 -2
  487. package/dist/lang/source-edit.js.map +1 -1
  488. package/dist/lang/symbol-table.generated.d.ts +36 -0
  489. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  490. package/dist/lang/symbol-table.generated.js +36 -0
  491. package/dist/lang/symbol-table.generated.js.map +1 -1
  492. package/dist/mesh/import-model.d.ts +94 -0
  493. package/dist/mesh/import-model.d.ts.map +1 -0
  494. package/dist/mesh/import-model.js +15 -0
  495. package/dist/mesh/import-model.js.map +1 -0
  496. package/dist/mesh/index.d.ts +19 -58
  497. package/dist/mesh/index.d.ts.map +1 -1
  498. package/dist/mesh/index.js +19 -70
  499. package/dist/mesh/index.js.map +1 -1
  500. package/dist/mesh/io.d.ts +33 -16
  501. package/dist/mesh/io.d.ts.map +1 -1
  502. package/dist/mesh/io.js +144 -39
  503. package/dist/mesh/io.js.map +1 -1
  504. package/dist/mesh/primitives.js +1 -1
  505. package/dist/mesh/primitives.js.map +1 -1
  506. package/dist/mesh/threemf-bambu.d.ts +12 -1
  507. package/dist/mesh/threemf-bambu.d.ts.map +1 -1
  508. package/dist/mesh/threemf-bambu.js +68 -16
  509. package/dist/mesh/threemf-bambu.js.map +1 -1
  510. package/dist/mesh/threemf-loader.d.ts +14 -1
  511. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  512. package/dist/mesh/threemf-loader.js +24 -7
  513. package/dist/mesh/threemf-loader.js.map +1 -1
  514. package/dist/mesh/transform.d.ts +1 -1
  515. package/dist/mesh/transform.js +1 -1
  516. package/dist/mesh/transform.js.map +1 -1
  517. package/dist/mesh/types.d.ts +5 -5
  518. package/dist/mesh/types.d.ts.map +1 -1
  519. package/dist/mesh/types.js.map +1 -1
  520. package/dist/node-host/cli.d.ts +49 -1
  521. package/dist/node-host/cli.d.ts.map +1 -1
  522. package/dist/node-host/cli.js +125 -19
  523. package/dist/node-host/cli.js.map +1 -1
  524. package/dist/node-host/execute-script.d.ts +55 -0
  525. package/dist/node-host/execute-script.d.ts.map +1 -0
  526. package/dist/node-host/execute-script.js +46 -0
  527. package/dist/node-host/execute-script.js.map +1 -0
  528. package/dist/node.d.ts +2 -0
  529. package/dist/node.d.ts.map +1 -1
  530. package/dist/node.js +3 -0
  531. package/dist/node.js.map +1 -1
  532. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
  533. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
  534. package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
  535. package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
  536. package/dist/occt-kernel/hullGeometry.d.ts +2 -2
  537. package/dist/occt-kernel/hullGeometry.js +2 -3
  538. package/dist/occt-kernel/hullGeometry.js.map +1 -1
  539. package/dist/occt-kernel/hullOps.d.ts +3 -3
  540. package/dist/occt-kernel/hullOps.js +4 -4
  541. package/dist/occt-kernel/hullOps.js.map +1 -1
  542. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  543. package/dist/occt-kernel/occt-primitives.js +31 -4
  544. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  545. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  546. package/dist/occt-kernel/occtKernel.js +18 -0
  547. package/dist/occt-kernel/occtKernel.js.map +1 -1
  548. package/dist/occt-scan/recognize.d.ts +58 -0
  549. package/dist/occt-scan/recognize.d.ts.map +1 -0
  550. package/dist/occt-scan/recognize.js +216 -0
  551. package/dist/occt-scan/recognize.js.map +1 -0
  552. package/dist/primitives/brep-primitives.js +7 -7
  553. package/dist/primitives/brep-primitives.js.map +1 -1
  554. package/dist/result/bug.d.ts +1 -1
  555. package/dist/result/bug.js +1 -1
  556. package/dist/result/bug.js.map +1 -1
  557. package/dist/result/errors.d.ts +2 -2
  558. package/dist/result/errors.d.ts.map +1 -1
  559. package/dist/result/errors.js +1 -1
  560. package/dist/result/errors.js.map +1 -1
  561. package/dist/result/vec3.d.ts +1 -1
  562. package/dist/result/vec3.js +1 -1
  563. package/dist/result/vec3.js.map +1 -1
  564. package/dist/runtime-state.d.ts +16 -0
  565. package/dist/runtime-state.d.ts.map +1 -1
  566. package/dist/runtime-state.js +27 -0
  567. package/dist/runtime-state.js.map +1 -1
  568. package/dist/script-globals.d.ts +24 -0
  569. package/dist/script-globals.d.ts.map +1 -0
  570. package/dist/script-globals.js +24 -0
  571. package/dist/script-globals.js.map +1 -0
  572. package/dist/shape.d.ts +24 -0
  573. package/dist/shape.d.ts.map +1 -1
  574. package/dist/shape.js +40 -0
  575. package/dist/shape.js.map +1 -1
  576. package/dist/topology/naming/lineage.d.ts +3 -2
  577. package/dist/topology/naming/lineage.d.ts.map +1 -1
  578. package/dist/topology/naming/lineage.js.map +1 -1
  579. package/dist/weapp.d.ts +1 -1
  580. package/dist/weapp.js +1 -1
  581. package/dist/weapp.js.map +1 -1
  582. package/package.json +8 -10
@@ -1 +1 @@
1
- {"version":3,"file":"threemf-loader.js","sourceRoot":"","sources":["../../src/mesh/threemf-loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * threemf-loader — headless 3MF (ZIP/OPC) geometry loader.\n *\n * 3MF is a ZIP container whose geometry lives in `3D/3dmodel.model`, an XML\n * document. Design requirements (unit-system §2.4/§5): the unit MUST be read\n * from the real (inflated) XML, NOT from the raw bytes — `3D/3dmodel.model` is\n * deflate-compressed inside the ZIP, so scanning the raw buffer cannot find\n * `<model unit=\"…\">` (the 3d_editor precedent returned 'millimeter' for real\n * files). We unzip the entry first, then parse the XML.\n *\n * Coordinate conversion: every coordinate is multiplied by `UNIT_SCALE[unit]`\n * to land in the faijs base length unit (mm).\n *\n * Per-object transform: `<item transform=\"a b c d e f g h i p q r\">` is an\n * ST_Matrix3D stored **column-major** whose last three tokens are the\n * translation `(p,q,r)`. Applied as:\n * x' = a*x + d*y + g*z + p\n * y' = b*x + e*y + h*z + q\n * z' = c*x + f*y + i*z + r\n * so object-local mesh coords bake into world-space positions.\n *\n * Return: an `ThreemfArchive` — per-instance objects (one per `<build><item>`,\n * transform baked, or per-`<resources>` object when `<build>` has no items at\n * all), plus every non-model archive entry surfaced as `extraEntries` so the\n * host can reach Bambu's private `model_settings.config` / thumbnails through\n * the *same unzipped map* (single unzip, two consumer chains).\n */\nimport { readZipEntries } from '../io/zip'\nimport { UNIT_SCALE, type UnitName } from '../units'\nimport type { ShapeMeta, FileMeta } from '../api/meta'\n\n/** Map a 3MF unit string to a faijs length unit name. */\nfunction threemfUnitToFaijs(unit: string): UnitName | null {\n switch (unit) {\n case 'micron': return 'micron'\n case 'millimeter': return 'mm'\n case 'centimeter': return 'cm'\n case 'inch': return 'inch'\n case 'foot': return 'foot'\n case 'meter': return 'm'\n default: return null\n }\n}\n\n/** `#RRGGBB` → sRGB components in 0..1 (leading `#` required, alpha ignored). */\nfunction hexToRgb(hex: string): readonly [number, number, number] | null {\n const m = /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/.exec(hex)\n if (!m) return null\n return [parseInt(m[1], 16) / 255, parseInt(m[2], 16) / 255, parseInt(m[3], 16) / 255]\n}\n\n/** Per-triangle material properties (3MF `pid`/`p1`/`p2`/`p3`). */\ninterface TriMaterialProps {\n pid?: string\n p1?: number\n p2?: number\n p3?: number\n}\n\n/** One `<component>` reference inside an object's `<components>` list. */\ninterface ObjectComponent {\n objectId: number\n /** ST_Matrix3D tokens (12 or validated 16 → first 12); null = malformed → identity. */\n transform: readonly number[] | null\n}\n\n/** Object-level geometry + material metadata collected during resources scan. */\ninterface ObjectMeshMeta {\n id: number\n name?: string\n /** `<object><metadatagroup><metadata name=\"faijs:description\">` 提升的描述。 */\n description?: string\n /** `<object partnumber>`(料号,规范要求编辑/派生尽量保留)。 */\n partNumber?: string\n /** `<object><metadatagroup><metadata name>`(键含命名空间前缀)。 */\n metadata?: Record<string, string>\n /** Object-level `pid` (applies to every triangle without its own `pid`). */\n pid?: string\n /** Object-level `pindex` (default base/color index when a triangle omits p1..p3). */\n pindex?: number\n /**\n * Present when the object carries a `<mesh>`; a pure component container\n * (no mesh, only `<components>`) has neither positions nor indices.\n */\n positions?: Float32Array\n indices?: Uint32Array\n /** Per-triangle material props; undefined when the object uses none. */\n triProps?: TriMaterialProps[]\n /** `<components>` children (Bambu builds plates/assemblies this way). */\n components?: ObjectComponent[]\n}\n\n/** Bake a column-major ST_Matrix3D (translation = last three tokens) into positions. */\nfunction bakeTransform(positions: Float32Array, m: readonly number[]): Float32Array {\n const [a, b, c, d, e, f, g, h, iz, p, q, r] = m\n const out = new Float32Array(positions.length)\n for (let v = 0; v < positions.length; v += 3) {\n const x = positions[v]\n const y = positions[v + 1]\n const z = positions[v + 2]\n out[v] = a * x + d * y + g * z + p\n out[v + 1] = b * x + e * y + h * z + q\n out[v + 2] = c * x + f * y + iz * z + r\n }\n return out\n}\n\n/**\n * Compose two ST_Matrix3D column-major transforms (12 tokens each, same\n * layout as `bakeTransform`: `[a b c, d e f, g h i, p q r]`, translation last).\n *\n * Semantics: the child transform is applied first, then the parent —\n * `M = parent · child` (the child lives in the parent's space, exactly like\n * three.js `clone.applyMatrix4(parent).applyMatrix4(child)`).\n */\nfunction composeTransform(parent: readonly number[], child: readonly number[]): number[] {\n const [a1, b1, c1, d1, e1, f1, g1, h1, i1, p1, q1, r1] = parent\n const [a2, b2, c2, d2, e2, f2, g2, h2, i2, p2, q2, r2] = child\n return [\n a1 * a2 + d1 * b2 + g1 * c2,\n b1 * a2 + e1 * b2 + h1 * c2,\n c1 * a2 + f1 * b2 + i1 * c2,\n a1 * d2 + d1 * e2 + g1 * f2,\n b1 * d2 + e1 * e2 + h1 * f2,\n c1 * d2 + f1 * e2 + i1 * f2,\n a1 * g2 + d1 * h2 + g1 * i2,\n b1 * g2 + e1 * h2 + h1 * i2,\n c1 * g2 + f1 * h2 + i1 * i2,\n a1 * p2 + d1 * q2 + g1 * r2 + p1,\n b1 * p2 + e1 * q2 + h1 * r2 + q1,\n c1 * p2 + f1 * q2 + i1 * r2 + r1,\n ]\n}\n\n/**\n * Parse an ST_Matrix3D attribute (12 or 16 tokens with trailing \"0 0 0 1\").\n * Returns the first 12 tokens when valid, `null` when malformed (caller\n * ignores the transform instead of baking NaN — mirrors the host tolerance\n * contract).\n */\nfunction parseTransformAttr(raw: string | null): readonly number[] | null {\n if (!raw) return null\n const t = raw.trim().split(/\\s+/).map(Number)\n const valid =\n t.length === 12 ||\n (t.length === 16 && t[12] === 0 && t[13] === 0 && t[14] === 0 && t[15] === 1)\n if (!valid || !t.every((n) => Number.isFinite(n))) return null\n return t.length === 12 ? t : t.slice(0, 12)\n}\n\n/** One parsed 3MF object instance: triangle soup in mm base (unit-scaled). */\nexport interface ThreemfObject {\n /** The `<object id>` this instance instantiates. */\n id: number\n /** The object's `<object name>` (Bambu exports a human label here). */\n name?: string\n positions: Float32Array\n indices: Uint32Array\n /**\n * Basematerials display color, `[r, g, b]` in 0..1 (sRGB components as\n * written in the file, matching the host's `setStyle(…, SRGBColorSpace)`).\n * Set when every triangle of the object references the *same* base index;\n * multi-base objects cannot be expressed by a single color → undefined\n * (host falls back to the default material).\n */\n baseColor?: readonly [number, number, number]\n /**\n * Colorgroup vertex colors, one RGB triple per emitted vertex — the geometry\n * is *expanded* (each triangle owns 3 independent vertices, indices are\n * sequential) whenever a colorgroup is referenced, so per-triangle\n * p1/p2/p3 colors survive without shared-vertex conflicts. Length equals\n * `positions.length`.\n */\n vertexColors?: Float32Array\n /**\n * Per-triangle base-material groups (P4, 3MF Core `<triangle pid p1..p3>`\n * with p1=p2=p3 referencing a `<basematerials>` base): maximal runs of\n * consecutive triangles sharing one base index, each with that base's\n * display color. Triangles with mixed p1/p2/p3 (vertex-attribute\n * interpolation) are skipped. Multi-base objects surface here instead of a\n * single `baseColor`.\n */\n materialGroups?: Array<{ start: number; count: number; color: [number, number, number] }>\n /**\n * 零件级说明性元数据(设计文档 2026-10-05-meta §5.1):`name` 来自\n * `<object name>`;`partNumber` 来自 `<object partnumber>`;`metadata` 来自\n * `<object><metadatagroup><metadata name>…`(键保留命名空间前缀)。组件实例\n * (component 容器)只带对所引用对象的 meta 拷贝。\n */\n meta?: ShapeMeta\n}\n\n/** Structured 3MF parse result. */\nexport interface ThreemfArchive {\n /** The declared `<model unit>` mapped to a faijs UnitName. */\n unit: UnitName\n /** One object per build `<item>` (transform baked), or per `<resources>` object. */\n objects: ThreemfObject[]\n /** Every non-model archive entry (key → raw bytes) for downstream consumers. */\n extraEntries: Map<string, Uint8Array>\n /** 整体级元数据(设计文档 2026-10-meta 表中的 3MF model context;`<model><metadata>`)。 */\n fileMeta?: FileMeta\n}\n\n/** Detect triangle-level material attributes (fast-3mf port). */\nconst TRI_MATERIAL_ATTR_RE = /(?:^|\\s)(?:p1|p2|p3|pid)=\"/\n\n/**\n * Loose vertex re-parse: extracts x/y/z independently, tolerating attribute\n * reordering or newlines inside a vertex tag. Slow path — only used when the\n * strict regex scan reports a count mismatch (fast-3mf port).\n */\nfunction parseVerticesLoose(vertSec: string): Float32Array | null {\n const vRe = /<vertex\\s+([^>]*?)\\/?>/g\n const positions: number[] = []\n let vm: RegExpExecArray | null\n while ((vm = vRe.exec(vertSec)) !== null) {\n const a = vm[1]\n const x = /(?:^|\\s)x=\"(-?[\\d.eE+-]+)\"/.exec(a)?.[1]\n const y = /(?:^|\\s)y=\"(-?[\\d.eE+-]+)\"/.exec(a)?.[1]\n const z = /(?:^|\\s)z=\"(-?[\\d.eE+-]+)\"/.exec(a)?.[1]\n if (x === undefined || y === undefined || z === undefined) return null\n positions.push(+x, +y, +z)\n }\n return new Float32Array(positions)\n}\n\n/**\n * Loose triangle re-parse: extracts v1/v2/v3 (and pid/p1/p2/p3 when needed)\n * per attribute, tolerating attribute reordering (fast-3mf port). Slow path —\n * only used when the strict regex scan reports a count mismatch.\n */\nfunction parseTrianglesLoose(\n triSec: string,\n withProps: boolean,\n): { index: Uint32Array; props: TriMaterialProps[] | null } | null {\n const tFullRe = /<triangle\\s+([^>]*?)\\/?>/g\n const idx: number[] = []\n const props: TriMaterialProps[] = []\n let tm: RegExpExecArray | null\n while ((tm = tFullRe.exec(triSec)) !== null) {\n const a = tm[1]\n const v1 = /(?:^|\\s)v1=\"(\\d+)\"/.exec(a)?.[1]\n const v2 = /(?:^|\\s)v2=\"(\\d+)\"/.exec(a)?.[1]\n const v3 = /(?:^|\\s)v3=\"(\\d+)\"/.exec(a)?.[1]\n if (v1 === undefined || v2 === undefined || v3 === undefined) return null\n idx.push(+v1, +v2, +v3)\n if (withProps) {\n const p: TriMaterialProps = {}\n const pid = /(?:^|\\s)pid=\"([^\"]*)\"/.exec(a)?.[1]\n if (pid !== undefined) p.pid = pid\n const p1 = /(?:^|\\s)p1=\"([^\"]*)\"/.exec(a)?.[1]\n if (p1 !== undefined) p.p1 = +p1\n const p2 = /(?:^|\\s)p2=\"([^\"]*)\"/.exec(a)?.[1]\n if (p2 !== undefined) p.p2 = +p2\n const p3 = /(?:^|\\s)p3=\"([^\"]*)\"/.exec(a)?.[1]\n if (p3 !== undefined) p.p3 = +p3\n props.push(p)\n }\n }\n return { index: new Uint32Array(idx), props: withProps ? props : null }\n}\n\n/**\n * Stream-scan one model XML document for `<resources>` material libraries and\n * `<object>` entries, merging into the shared maps (caller keeps sub-models\n * first / root last so the root wins id collisions).\n *\n * Text-scanner (no DOM) — ported from the host's retired fast-3mf parser, so\n * very large model documents (Bambu exports reach ~140 MB of XML, where a full\n * DOM parse exhausts the heap) stay linear in memory. Attribute extraction\n * keeps fast-3mf's tolerance: attribute reordering / newline variance falls\n * back to a loose re-parse; namespace-prefixed attributes (`p:objectid`,\n * `p:transform`) match through substring.\n */\nfunction scanResources(\n xml: string,\n scale: number,\n basematerialsById: Map<string, { name?: string; displaycolor?: string }[]>,\n colorgroupsById: Map<string, Float32Array>,\n byObjectId: Map<number, ObjectMeshMeta>,\n): void {\n const resourcesStart = xml.indexOf('<resources>')\n if (resourcesStart < 0) return\n const resourcesEnd = xml.indexOf('</resources>', resourcesStart)\n const resBody = resourcesEnd >= 0\n ? xml.slice(resourcesStart, resourcesEnd)\n : xml.slice(resourcesStart)\n\n // basematerials: id + base list (name/displaycolor).\n const bmRe = /<basematerials\\s+([^>]*)>([\\s\\S]*?)<\\/basematerials>/g\n let m: RegExpExecArray | null\n while ((m = bmRe.exec(resBody)) !== null) {\n const id = /(?:^|\\s)id=\"([^\"]+)\"/.exec(m[1])?.[1]\n if (id === undefined) continue\n const bases: { name?: string; displaycolor?: string }[] = []\n const baseRe = /<base\\s+([^>]*?)\\/?>/g\n let bm2: RegExpExecArray | null\n while ((bm2 = baseRe.exec(m[2])) !== null) {\n bases.push({\n name: /(?:^|\\s)name=\"([^\"]*)\"/.exec(bm2[1])?.[1],\n displaycolor: /(?:^|\\s)displaycolor=\"([^\"]*)\"/.exec(bm2[1])?.[1],\n })\n }\n basematerialsById.set(id, bases)\n }\n\n // colorgroup: id + color list (hex → sRGB components).\n const cgRe = /<colorgroup\\s+([^>]*)>([\\s\\S]*?)<\\/colorgroup>/g\n while ((m = cgRe.exec(resBody)) !== null) {\n const id = /(?:^|\\s)id=\"([^\"]+)\"/.exec(m[1])?.[1]\n if (id === undefined) continue\n const colors: number[] = []\n const colorRe = /<color\\s+([^>]*?)\\/?>/g\n let cm: RegExpExecArray | null\n while ((cm = colorRe.exec(m[2])) !== null) {\n const hex = /(?:^|\\s)color=\"([^\"]*)\"/.exec(cm[1])?.[1]?.slice(0, 7) ?? '#000000'\n const rgb = hexToRgb(hex) ?? [0, 0, 0]\n colors.push(rgb[0], rgb[1], rgb[2])\n }\n colorgroupsById.set(id, new Float32Array(colors))\n }\n\n // objects — scanned across the whole document (not just `<resources>`) so\n // out-of-resources `<object>` placements still load (external-data tolerance).\n const objRe = /<object\\s+([^>]*)>([\\s\\S]*?)<\\/object>/g\n while ((m = objRe.exec(xml)) !== null) {\n const attrs = m[1]\n const body = m[2]\n const idRaw = /(?:^|\\s)id=\"([^\"]+)\"/.exec(attrs)?.[1]\n if (idRaw === undefined) continue\n const id = Number(idRaw)\n if (!Number.isInteger(id)) continue\n const name = /(?:^|\\s)name=\"([^\"]*)\"/.exec(attrs)?.[1]\n const objPid = /(?:^|\\s)pid=\"([^\"]*)\"/.exec(attrs)?.[1]\n const objPindexRaw = /(?:^|\\s)pindex=\"([^\"]*)\"/.exec(attrs)?.[1]\n const objPindex = objPindexRaw !== undefined && objPindexRaw !== '' ? Number(objPindexRaw) : undefined\n // 料号(`<object partnumber>`)。\n const partNumber = /(?:^|\\s)partnumber=\"([^\"]*)\"/.exec(attrs)?.[1]\n // 对象级 `<metadatagroup><metadata name=\"ns:key\">…`(vendor 前缀键,值取 text 或 name)。\n // faijs 写出的 `faijs:description` 提升为对象级 `description`(§6.1 写回 §5.1 读,\n // 保证 description 往返不落进自定义键);其余键保留原始名进 metadata。\n const metadata: Record<string, string> = {}\n let objectDescription: string | undefined\n const mgRe = /<metadatagroup[^>]*>([\\s\\S]*?)<\\/metadatagroup>/g\n let mgm: RegExpExecArray | null\n while ((mgm = mgRe.exec(body)) !== null) {\n const mdRe = /<metadata\\s+([^>]*?)(?:\\/>|>([\\s\\S]*?)<\\/metadata>)/g\n let mdm: RegExpExecArray | null\n while ((mdm = mdRe.exec(mgm[1])) !== null) {\n const key = /(?:^|\\s)name=\"([^\"]*)\"/.exec(mdm[1])?.[1]\n if (key === undefined) continue\n const text = mdm[2] !== undefined ? /(?:^|\\s)value=\"([^\"]*)\"/.exec(mdm[1])?.[1] : undefined\n const val =\n text ??\n (mdm[2] !== undefined ? mdm[2].replace(/<[^>]*>/g, '').trim() : undefined)\n if (val === undefined) continue\n if (key === 'faijs:description') objectDescription = val\n else metadata[key] = val\n }\n }\n\n let meta: ObjectMeshMeta = {\n id,\n name,\n description: objectDescription,\n partNumber,\n metadata,\n pid: objPid,\n pindex: objPindex,\n }\n\n // mesh: vertices + triangles (fast-3mf port — strict regex scan with a\n // loose attribute-order fallback; missing sub-sections are tolerated and\n // the object still registers, matching the retired host behavior).\n const meshStart = body.indexOf('<mesh>')\n const meshEnd = body.indexOf('</mesh>')\n if (meshStart >= 0 && meshEnd > meshStart) {\n const meshBody = body.slice(meshStart, meshEnd)\n\n // vertices\n const vertStart = meshBody.indexOf('<vertices>')\n const vertEnd = meshBody.indexOf('</vertices>')\n if (vertStart >= 0 && vertEnd > vertStart) {\n const vertSec = meshBody.slice(vertStart, vertEnd)\n let vc = 0\n let p = 0\n while ((p = vertSec.indexOf('<vertex ', p)) !== -1) { vc++; p += 8 }\n const vRe = /x=\"(-?[\\d.eE+-]+)\"\\s+y=\"(-?[\\d.eE+-]+)\"\\s+z=\"(-?[\\d.eE+-]+)\"/g\n let positions = new Float32Array(vc * 3)\n let vm: RegExpExecArray | null\n let vi = 0\n while ((vm = vRe.exec(vertSec)) !== null) {\n positions[vi] = +vm[1] * scale\n positions[vi + 1] = +vm[2] * scale\n positions[vi + 2] = +vm[3] * scale\n vi += 3\n }\n // XML attributes are unordered (spec XSD) — if any vertex failed to\n // match (different attribute order / newline after tag), re-scan each\n // attribute independently instead of giving up.\n if (vc > 0 && vi !== vc * 3) {\n const loose = parseVerticesLoose(vertSec)\n if (!loose) {\n throw new Error(`[mesh/threemf] cannot parse <vertices> in object ${id}`)\n }\n positions = new Float32Array(loose.length)\n for (let i = 0; i < loose.length; i++) positions[i] = loose[i] * scale\n }\n meta = { ...meta, positions }\n }\n\n // triangles\n const triStart = meshBody.indexOf('<triangles>')\n const triEnd = meshBody.indexOf('</triangles>')\n if (triStart >= 0 && triEnd > triStart) {\n const triSec = meshBody.slice(triStart, triEnd)\n let tc = 0\n let p = 0\n while ((p = triSec.indexOf('<triangle ', p)) !== -1) { tc++; p += 10 }\n const idx = new Uint32Array(tc * 3)\n const hasMatAttrs = TRI_MATERIAL_ATTR_RE.test(triSec)\n // Object-level pid without per-triangle material attrs: synthesize\n // triangle properties so every triangle still routes through the\n // resource (object pindex default) — fast-3mf semantics.\n const needsProps = hasMatAttrs || objPid !== undefined\n const triProps: TriMaterialProps[] | undefined = needsProps ? [] : undefined\n const tRe = /v1=\"(\\d+)\"\\s+v2=\"(\\d+)\"\\s+v3=\"(\\d+)\"/g\n let tm: RegExpExecArray | null\n let ti = 0\n while ((tm = tRe.exec(triSec)) !== null) {\n idx[ti] = +tm[1]\n idx[ti + 1] = +tm[2]\n idx[ti + 2] = +tm[3]\n ti += 3\n }\n if (tc > 0 && ti !== tc * 3) {\n // Attribute order / newline variance → re-scan each attribute\n // independently (slow path, rare).\n const loose = parseTrianglesLoose(triSec, needsProps)\n if (!loose) {\n throw new Error(`[mesh/threemf] cannot parse <triangles> in object ${id}`)\n }\n idx.set(loose.index)\n if (loose.props) {\n triProps!.length = 0\n triProps!.push(...loose.props)\n }\n } else if (needsProps) {\n if (hasMatAttrs) {\n const tFullRe = /<triangle\\s+([^>]*?)\\/?>/g\n let tfm: RegExpExecArray | null\n while ((tfm = tFullRe.exec(triSec)) !== null) {\n const a = tfm[1]\n const tv = /v1=\"(\\d+)\"\\s+v2=\"(\\d+)\"\\s+v3=\"(\\d+)\"/.exec(a)\n if (!tv) continue\n const prop: TriMaterialProps = {}\n const p1 = /\\bp1=\"([^\"]*)\"/.exec(a)?.[1]\n if (p1 !== undefined) prop.p1 = +p1\n const p2 = /\\bp2=\"([^\"]*)\"/.exec(a)?.[1]\n if (p2 !== undefined) prop.p2 = +p2\n const p3 = /\\bp3=\"([^\"]*)\"/.exec(a)?.[1]\n if (p3 !== undefined) prop.p3 = +p3\n const pidm = /\\bpid=\"([^\"]*)\"/.exec(a)?.[1]\n if (pidm !== undefined) prop.pid = pidm\n triProps!.push(prop)\n }\n } else {\n // Object-level pid only → synthesized props (no per-triangle\n // material attrs) so materializeMesh's per-triangle lookups fall\n // through to the object-level defaults.\n for (let i = 0; i < tc; i++) triProps!.push({})\n }\n }\n meta = { ...meta, indices: idx, triProps }\n }\n }\n\n // `<components>` children — Bambu builds plates/assemblies this way.\n // A pure component container has no mesh; it still registers in byObjectId\n // so build items referencing it expand recursively (component instances).\n const compStart = body.indexOf('<components>')\n if (compStart >= 0) {\n const compEnd = body.indexOf('</components>', compStart)\n const compSec = compEnd >= 0\n ? body.slice(compStart + '<components>'.length, compEnd)\n : body.slice(compStart + '<components>'.length)\n const comps: ObjectComponent[] = []\n const compRe = /<component\\s+([^>]*?)\\/?>/g\n let cpm: RegExpExecArray | null\n while ((cpm = compRe.exec(compSec)) !== null) {\n const oid = Number(/objectid=\"([^\"]+)\"/.exec(cpm[1])?.[1])\n if (!Number.isInteger(oid)) continue\n comps.push({\n objectId: oid,\n transform: parseTransformAttr(/\\btransform=\"([^\"]*)\"/.exec(cpm[1])?.[1] ?? null),\n })\n }\n if (comps.length > 0) meta = { ...meta, components: comps }\n }\n\n if (!meta.positions && !meta.components) continue\n byObjectId.set(id, meta)\n }\n}\n\n/** 3MF Core well-known model-level metadata names → FileMeta 字段映射。 */\ntype FileMetaStringKey = Exclude<keyof FileMeta, 'metadata'>\nconst MODEL_METADATA_FIELD: Record<string, FileMetaStringKey> = {\n Title: 'title',\n Designer: 'designer',\n Description: 'description',\n Copyright: 'copyright',\n LicenseTerms: 'licenseTerms',\n Rating: 'rating',\n CreationDate: 'creationDate',\n ModificationDate: 'modificationDate',\n Application: 'application',\n}\n\n/**\n * Parse `FileMeta` from the root model document's direct `<metadata>` children\n * (3MF Core model context). Well-known names (Title/Designer/…) map onto the\n * FileMeta fields; any other (vendor-namespaced) name is kept verbatim in\n * `FileMeta.metadata` (key preserves its namespace prefix). Value = text\n * content or a `value` attribute; empties are skipped.\n */\nfunction parseModelMetadata(rootDoc: string): FileMeta | undefined {\n // 仅取 `<model …>` 到 `<resources>`/`<build>` 之前的前导区段——模型级元数据\n // 是 `<model>` 的直接子级,排在 `<resources>` 之前;避免把对象级/metadatagroup\n // 里的同名 `<metadata>` 误收进 fileMeta。\n const modelStart = rootDoc.indexOf('<model')\n if (modelStart < 0) return undefined\n const resAt = rootDoc.indexOf('<resources>', modelStart)\n const buildAt = rootDoc.indexOf('<build', modelStart)\n const endCandidates = [resAt, buildAt].filter((i) => i >= 0)\n const sectionEnd = endCandidates.length > 0 ? Math.min(...endCandidates) : rootDoc.length\n const section = rootDoc.slice(modelStart, sectionEnd)\n\n const meta: FileMeta = {}\n let custom: Record<string, string> | undefined\n const mdRe = /<metadata\\s+([^>]*?)(?:\\/>|>([\\s\\S]*?)<\\/metadata>)/g\n let mdm: RegExpExecArray | null\n while ((mdm = mdRe.exec(section)) !== null) {\n const attrs = mdm[1]\n const name = /(?:^|\\s)name=\"([^\"]*)\"/.exec(attrs)?.[1]\n if (name === undefined) continue\n const valAttr = /(?:^|\\s)value=\"([^\"]*)\"/.exec(attrs)?.[1]\n const val = valAttr ?? (mdm[2] !== undefined ? mdm[2].replace(/<[^>]*>/g, '').trim() : '')\n if (val === '') continue\n const field = MODEL_METADATA_FIELD[name]\n if (field) {\n meta[field] = val\n } else {\n custom = custom ?? {}\n custom[name] = val\n }\n }\n if (custom && Object.keys(custom).length > 0) meta.metadata = custom\n return Object.keys(meta).length > 0 ? meta : undefined\n}\n\n/**\n * Parse the 3MF model XML documents (root + sub-models) into archive objects.\n * skeletons (component containers) plus the `<build>`, while the actual mesh\n * geometry lives in per-object files `3D/Objects/object_*.model` referenced\n * through `p:path` (production extension) — which we ignore in favor of\n * merging every model document's `<resources>` by object id (mirrors the\n * host's fast-3mf collection order: sub-models first, root model last, root\n * wins on id collisions).\n *\n * `unit` is read from the ROOT model document (the file the build items\n * belong to); all documents share the same declared unit in practice.\n */\nfunction parseModelXml(docTexts: string[]): {\n unitName: UnitName\n objects: ThreemfObject[]\n fileMeta?: FileMeta\n} {\n // Last document = root model (caller appends it last).\n const rootDoc = docTexts[docTexts.length - 1]\n const unitMatch = /<model\\b[^>]*\\bunit=\"([^\"]+)\"/.exec(rootDoc)\n const unit = unitMatch ? unitMatch[1] : 'millimeter'\n const unitName = threemfUnitToFaijs(unit)\n if (unitName === null) {\n throw new Error(`[mesh/threemf] unsupported <model unit>: ${JSON.stringify(unit)}`)\n }\n const scale = UNIT_SCALE[unitName]\n\n // 整体级元数据(`<model>` 直接子级 `<metadata>`;well-known 名映射到\n // FileMeta 字段,vendor 前缀名兜底进 FileMeta.metadata)。\n const fileMeta = parseModelMetadata(rootDoc)\n\n // resources → material libraries (basematerials / colorgroup) + objects,\n // merged across every model document (sub-models first, root last).\n const basematerialsById = new Map<string, { name?: string; displaycolor?: string }[]>()\n const colorgroupsById = new Map<string, Float32Array>()\n const byObjectId = new Map<number, ObjectMeshMeta>()\n\n for (const text of docTexts) {\n scanResources(text, scale, basematerialsById, colorgroupsById, byObjectId)\n }\n // (scanResources above handles basematerials / colorgroup / objects)\n // (mesh/components + registration handled by scanResources)\n\n /**\n * Materialize object instances: a mesh object yields ONE ThreemfObject with\n * the transform baked in and base/vertex colors resolved; a component\n * container recursively expands each child (composing transforms, child\n * applied first), one ThreemfObject per leaf mesh instance — mirroring the\n * host's clone-and-apply semantics without shared geometry. `path` guards\n * reference cycles (a self-referencing component chain terminates).\n */\n function materialize(\n src: ObjectMeshMeta,\n mat: readonly number[] | undefined,\n path: Set<number>,\n ): ThreemfObject[] {\n if (src.positions && src.indices) {\n return [materializeMesh(src, mat)]\n }\n if (src.components && src.components.length > 0) {\n const out: ThreemfObject[] = []\n for (const comp of src.components) {\n if (path.has(comp.objectId)) continue\n const ref = byObjectId.get(comp.objectId)\n if (!ref) continue\n const next = comp.transform\n ? (mat ? composeTransform(mat, comp.transform) : comp.transform)\n : mat\n const nextPath = new Set(path)\n nextPath.add(comp.objectId)\n out.push(...materialize(ref, next, nextPath))\n }\n return out\n }\n return []\n }\n\n /**\n * Materialize a single mesh object instance: bake the optional build\n * transform and resolve base/vertex colors. `vertexColors` expands the\n * geometry (each triangle owns 3 independent vertices) so per-triangle\n * p1/p2/p3 survive; `baseColor` keeps the compact form and applies only\n * when every triangle references the same base index (multi-base objects\n * fall back to the default material, matching the host contract).\n */\n /** 组装零件级 meta(仅当至少一个字段存在)。\n * 组件容器(component 引用)沿 ref 链透传同一 meta 对象引用。 */\n function srcMeta(src: ObjectMeshMeta): ShapeMeta | undefined {\n const meta: ShapeMeta = {}\n if (src.name !== undefined && src.name !== '') meta.name = src.name\n if (src.description !== undefined && src.description !== '') meta.description = src.description\n if (src.partNumber !== undefined && src.partNumber !== '') meta.partNumber = src.partNumber\n if (src.metadata && Object.keys(src.metadata).length > 0) meta.metadata = src.metadata\n return Object.keys(meta).length > 0 ? meta : undefined\n }\n\n function materializeMesh(src: ObjectMeshMeta, mat?: readonly number[]): ThreemfObject {\n const positions = src.positions!\n const indices = src.indices!\n let pid: string | undefined\n if (src.triProps) {\n for (const p of src.triProps) {\n const eff = p.pid ?? src.pid\n if (eff !== undefined) { pid = eff; break }\n }\n } else {\n pid = src.pid\n }\n\n const cg = pid !== undefined ? colorgroupsById.get(pid) : undefined\n if (cg) {\n const triCount = indices.length / 3\n const outPos = new Float32Array(triCount * 9)\n const outCol = new Float32Array(triCount * 9)\n const outIdx = new Uint32Array(triCount * 3)\n const objectPindex = src.pindex\n for (let t = 0; t < triCount; t++) {\n const v1 = indices[t * 3]\n const v2 = indices[t * 3 + 1]\n const v3 = indices[t * 3 + 2]\n const tp = src.triProps ? src.triProps[t] : undefined\n const p1 = tp?.p1 ?? objectPindex ?? 0\n const p2 = tp?.p2 ?? p1\n const p3 = tp?.p3 ?? p1\n // vertex-contiguous layout (x1 y1 z1 x2 y2 z2 x3 y3 z3 / R1 G1 B1 …):\n // each emitted vertex owns 3 consecutive components.\n const vs = [v1, v2, v3]\n const ps = [p1, p2, p3]\n for (let k = 0; k < 3; k++) {\n const sv = vs[k]\n const sp = ps[k]\n outPos[t * 9 + k * 3] = positions[sv * 3]\n outPos[t * 9 + k * 3 + 1] = positions[sv * 3 + 1]\n outPos[t * 9 + k * 3 + 2] = positions[sv * 3 + 2]\n outCol[t * 9 + k * 3] = cg[sp * 3]\n outCol[t * 9 + k * 3 + 1] = cg[sp * 3 + 1]\n outCol[t * 9 + k * 3 + 2] = cg[sp * 3 + 2]\n }\n outIdx[t * 3] = t * 3\n outIdx[t * 3 + 1] = t * 3 + 1\n outIdx[t * 3 + 2] = t * 3 + 2\n }\n return {\n id: src.id,\n name: src.name,\n positions: mat ? bakeTransform(outPos, mat) : outPos,\n indices: outIdx,\n vertexColors: outCol,\n ...(srcMeta(src) ? { meta: srcMeta(src) } : {}),\n }\n }\n\n const bases = pid !== undefined ? basematerialsById.get(pid) : undefined\n if (bases && bases.length > 0) {\n const idx0 = src.triProps ? (src.triProps[0]?.p1 ?? src.pindex ?? 0) : (src.pindex ?? 0)\n let same = true\n let refKey = ''\n if (src.triProps) {\n for (const tp of src.triProps) {\n const effPid = tp.pid ?? src.pid\n const key = effPid !== undefined ? `${effPid}:${tp.p1 ?? src.pindex ?? 0}` : ''\n if (refKey === '') refKey = key\n else if (key !== refKey) {\n same = false\n break\n }\n }\n } else {\n refKey = pid !== undefined ? `${pid}:${src.pindex ?? 0}` : ''\n }\n const base = bases[idx0]\n // baseColor 只对「全部三角形同一 (pid, base)」的对象设置(P2 单色便捷\n // 字段);无材质三角形或混合 pid/base 的对象 → undefined(走 materialGroups)。\n const baseColor = same && refKey !== '' && base?.displaycolor\n ? hexToRgb(base.displaycolor.slice(0, 7))\n : undefined\n // P4(3MF Core 逐三角形材质):p1=p2=p3 的三角形按(有效 pid, base 索引)\n // 分组成 materialGroups(连续三角形区间 + 该 base 的 displaycolor);\n // 无材质(对象与三角形均无 pid)、混合 p1/p2/p3(顶点属性插值)跳过。\n // 同色对象仍走 baseColor 便捷字段(P2 兼容);多 base 对象在\n // materialGroups 表达(baseColor undefined)。\n const groups: Array<{ start: number; count: number; color: [number, number, number] }> = []\n const triProps = src.triProps\n const triCount = triProps?.length ?? indices.length / 3\n if (triProps) {\n let runStart = -1\n let runKey = ''\n let runColor: [number, number, number] | undefined\n const flush = (end: number): void => {\n if (runStart >= 0 && runColor) {\n groups.push({ start: runStart, count: end - runStart, color: runColor })\n }\n runStart = -1\n runKey = ''\n runColor = undefined\n }\n for (let t = 0; t < triCount; t++) {\n const tp: TriMaterialProps | undefined = triProps[t]\n let key = ''\n let color: [number, number, number] | undefined\n if (tp) {\n const effPid = tp.pid ?? src.pid\n if (effPid !== undefined) {\n const bases = basematerialsById.get(effPid)\n const bi = tp.p1 ?? src.pindex ?? 0\n if (bases && bi >= 0 && bi < bases.length && tp.p1 === tp.p2 && tp.p2 === tp.p3) {\n const c = bases[bi]?.displaycolor\n if (c) {\n key = `${effPid}:${bi}`\n const rgb = hexToRgb(c.slice(0, 7))\n if (rgb) color = [rgb[0], rgb[1], rgb[2]]\n }\n }\n }\n }\n if (key !== '' && key === runKey) continue\n flush(t)\n if (key !== '') {\n runStart = t\n runKey = key\n runColor = color\n }\n }\n flush(triCount)\n }\n // 单一分组且覆盖全部三角形 = 单色对象 → 走 baseColor(P2 便捷字段),\n // 不挂 materialGroups(避免冗余双表达);仅部分覆盖或多组才用 materialGroups。\n const singleFull =\n groups.length === 1 && groups[0].start === 0 && groups[0].count === triCount\n return {\n id: src.id,\n name: src.name,\n positions: mat ? bakeTransform(positions, mat) : positions,\n indices,\n baseColor: baseColor ?? undefined,\n ...(!singleFull && groups.length > 0 ? { materialGroups: groups } : {}),\n ...(srcMeta(src) ? { meta: srcMeta(src) } : {}),\n }\n }\n\n return {\n id: src.id,\n name: src.name,\n positions: mat ? bakeTransform(positions, mat) : positions,\n indices,\n ...(srcMeta(src) ? { meta: srcMeta(src) } : {}),\n }\n }\n\n // build → item → per-instance transforms baked to world space.\n // `<build>` lives in the ROOT model document only.\n const buildMatch = /<build\\b[^>]*>/.exec(rootDoc)\n let buildSec = ''\n if (buildMatch) {\n const buildStart = buildMatch.index\n const buildEnd = rootDoc.indexOf('</build>', buildStart)\n buildSec = buildEnd >= 0 ? rootDoc.slice(buildStart, buildEnd) : rootDoc.slice(buildStart)\n }\n const itemRe = /<item\\b[^>]*>/g\n const out: ThreemfObject[] = []\n let itemCount = 0\n let im: RegExpExecArray | null\n while ((im = itemRe.exec(buildSec)) !== null) {\n itemCount++\n const attrs = im[0]\n const objId = Number(/(?:^|\\s)objectid=\"([^\"]+)\"/.exec(attrs)?.[1])\n const src = byObjectId.get(objId)\n if (!src) continue\n // ST_Matrix3D: 4×3 (12) or 4×4 (16) whose trailing row is \"0 0 0 1\";\n // malformed transforms are IGNORED (identity) — never bake NaN into\n // geometry (mirrors the host's fast-3mf tolerance contract).\n const tokens = parseTransformAttr(/\\btransform=\"([^\"]*)\"/.exec(attrs)?.[1] ?? null)\n out.push(...materialize(src, tokens ?? undefined, new Set([objId])))\n }\n if (itemCount === 0) {\n // No build items: emit every `<resources>` object directly (¶ the empty\n // `<build>` contract — NOT a fallback; see plan §8 decision 8).\n for (const src of byObjectId.values()) {\n out.push(...materialize(src, undefined, new Set([src.id])))\n }\n }\n\n if (out.length === 0) {\n throw new Error('[mesh/threemf] no buildable geometry found in 3dmodel.model')\n }\n return { unitName, objects: out, ...(fileMeta ? { fileMeta } : {}) }\n}\n\n/**\n * Parse 3MF bytes into a structured archive.\n *\n * Supports Bambu's multi-file layout: `3D/3dmodel.model` (root, holds the\n * `<build>` and component-container skeletons) plus per-object sub-models\n * `3D/Objects/*.model` whose `<resources>` are merged by object id\n * (sub-models first, root last — root wins collisions).\n *\n * @param buffer - the raw .3mf (ZIP) bytes.\n * @returns an `ThreemfArchive` with mm-base per-instance objects, the declared\n * source unit, and every non-model archive entry.\n * @throws when the buffer is not a 3MF/ZIP archive or the unit is invalid.\n */\nexport async function parseThreemf(buffer: ArrayBuffer): Promise<ThreemfArchive> {\n let entries: Map<string, Uint8Array>\n try {\n entries = readZipEntries(new Uint8Array(buffer))\n } catch {\n throw new Error('[mesh/threemf] not a valid 3MF ZIP archive')\n }\n const rootKey = [...entries.keys()].find((k) => k.toLowerCase() === '3d/3dmodel.model')\n if (!rootKey) {\n throw new Error('[mesh/threemf] missing 3D/3dmodel.model entry')\n }\n\n // Sub-model documents first (fast-3mf collection order), root model last.\n const docKeys: string[] = []\n for (const k of entries.keys()) {\n if (k.toLowerCase() === rootKey.toLowerCase()) continue\n if (/^3d\\/.+\\/[^/]+\\.model$/i.test(k)) docKeys.push(k)\n }\n docKeys.push(rootKey)\n const docTexts = docKeys.map((k) => new TextDecoder().decode(entries.get(k)!))\n const parsed = parseModelXml(docTexts)\n\n // `extraEntries` = everything that is NOT a model document — Bambu's\n // `Metadata/model_settings.config`, `Metadata/project_settings.config`,\n // `Metadata/thumbnail.png`, etc.\n const extraEntries = new Map<string, Uint8Array>()\n for (const [k, v] of entries) {\n if (/\\.model$/i.test(k)) continue\n extraEntries.set(k, v)\n }\n\n return { unit: parsed.unitName, objects: parsed.objects, extraEntries, ...(parsed.fileMeta ? { fileMeta: parsed.fileMeta } : {}) }\n}"]}
1
+ {"version":3,"file":"threemf-loader.js","sourceRoot":"","sources":["../../src/mesh/threemf-loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * threemf-loader — headless 3MF (ZIP/OPC) geometry loader.\n *\n * 3MF is a ZIP container whose geometry lives in `3D/3dmodel.model`, an XML\n * document. Design requirements (unit-system §2.4/§5): the unit MUST be read\n * from the real (inflated) XML, NOT from the raw bytes — `3D/3dmodel.model` is\n * deflate-compressed inside the ZIP, so scanning the raw buffer cannot find\n * `<model unit=\"…\">` (the 3d_editor precedent returned 'millimeter' for real\n * files). We unzip the entry first, then parse the XML.\n *\n * Coordinate conversion: every coordinate is multiplied by `UNIT_SCALE[unit]`\n * to land in the faijs base length unit (mm).\n *\n * Per-object transform: `<item transform=\"a b c d e f g h i p q r\">` is an\n * ST_Matrix3D stored **column-major** whose last three tokens are the\n * translation `(p,q,r)`. Applied as:\n * x' = a*x + d*y + g*z + p\n * y' = b*x + e*y + h*z + q\n * z' = c*x + f*y + i*z + r\n * so object-local mesh coords bake into world-space positions.\n *\n * Return: an `ThreemfArchive` — per-instance objects (one per `<build><item>`,\n * transform baked, or per-`<resources>` object when `<build>` has no items at\n * all), plus every non-model archive entry surfaced as `extraEntries` so the\n * host can reach Bambu's private `model_settings.config` / thumbnails through\n * the *same unzipped map* (single unzip, two consumer chains).\n */\nimport { readZipEntries } from '../io/zip'\nimport { UNIT_SCALE, type UnitName } from '../units'\nimport type { ShapeMeta, FileMeta } from '../api/meta'\n\n/** Map a 3MF unit string to a faijs length unit name. */\nfunction threemfUnitToFaijs(unit: string): UnitName | null {\n switch (unit) {\n case 'micron': return 'micron'\n case 'millimeter': return 'mm'\n case 'centimeter': return 'cm'\n case 'inch': return 'inch'\n case 'foot': return 'foot'\n case 'meter': return 'm'\n default: return null\n }\n}\n\n/** `#RRGGBB` → sRGB components in 0..1 (leading `#` required, alpha ignored). */\nfunction hexToRgb(hex: string): readonly [number, number, number] | null {\n const m = /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/.exec(hex)\n if (!m) return null\n return [parseInt(m[1], 16) / 255, parseInt(m[2], 16) / 255, parseInt(m[3], 16) / 255]\n}\n\n/** Per-triangle material properties (3MF `pid`/`p1`/`p2`/`p3`). */\ninterface TriMaterialProps {\n pid?: string\n p1?: number\n p2?: number\n p3?: number\n}\n\n/** One `<component>` reference inside an object's `<components>` list. */\ninterface ObjectComponent {\n objectId: number\n /** ST_Matrix3D tokens (12 or validated 16 → first 12); null = malformed → identity. */\n transform: readonly number[] | null\n}\n\n/** Object-level geometry + material metadata collected during resources scan. */\ninterface ObjectMeshMeta {\n id: number\n name?: string\n /** `<object><metadatagroup><metadata name=\"faijs:description\">` 提升的描述。 */\n description?: string\n /** `<object partnumber>`(料号,规范要求编辑/派生尽量保留)。 */\n partNumber?: string\n /** `<object><metadatagroup><metadata name>`(键含命名空间前缀)。 */\n metadata?: Record<string, string>\n /** Object-level `pid` (applies to every triangle without its own `pid`). */\n pid?: string\n /** Object-level `pindex` (default base/color index when a triangle omits p1..p3). */\n pindex?: number\n /**\n * Present when the object carries a `<mesh>`; a pure component container\n * (no mesh, only `<components>`) has neither positions nor indices.\n */\n positions?: Float32Array\n indices?: Uint32Array\n /** Per-triangle material props; undefined when the object uses none. */\n triProps?: TriMaterialProps[]\n /** `<components>` children (Bambu builds plates/assemblies this way). */\n components?: ObjectComponent[]\n}\n\n/** Bake a column-major ST_Matrix3D (translation = last three tokens) into positions. */\nfunction bakeTransform(positions: Float32Array, m: readonly number[]): Float32Array {\n const [a, b, c, d, e, f, g, h, iz, p, q, r] = m\n const out = new Float32Array(positions.length)\n for (let v = 0; v < positions.length; v += 3) {\n const x = positions[v]\n const y = positions[v + 1]\n const z = positions[v + 2]\n out[v] = a * x + d * y + g * z + p\n out[v + 1] = b * x + e * y + h * z + q\n out[v + 2] = c * x + f * y + iz * z + r\n }\n return out\n}\n\n/**\n * Compose two ST_Matrix3D column-major transforms (12 tokens each, same\n * layout as `bakeTransform`: `[a b c, d e f, g h i, p q r]`, translation last).\n *\n * Semantics: the child transform is applied first, then the parent —\n * `M = parent · child` (the child lives in the parent's space, exactly like\n * three.js `clone.applyMatrix4(parent).applyMatrix4(child)`).\n */\nfunction composeTransform(parent: readonly number[], child: readonly number[]): number[] {\n const [a1, b1, c1, d1, e1, f1, g1, h1, i1, p1, q1, r1] = parent\n const [a2, b2, c2, d2, e2, f2, g2, h2, i2, p2, q2, r2] = child\n return [\n a1 * a2 + d1 * b2 + g1 * c2,\n b1 * a2 + e1 * b2 + h1 * c2,\n c1 * a2 + f1 * b2 + i1 * c2,\n a1 * d2 + d1 * e2 + g1 * f2,\n b1 * d2 + e1 * e2 + h1 * f2,\n c1 * d2 + f1 * e2 + i1 * f2,\n a1 * g2 + d1 * h2 + g1 * i2,\n b1 * g2 + e1 * h2 + h1 * i2,\n c1 * g2 + f1 * h2 + i1 * i2,\n a1 * p2 + d1 * q2 + g1 * r2 + p1,\n b1 * p2 + e1 * q2 + h1 * r2 + q1,\n c1 * p2 + f1 * q2 + i1 * r2 + r1,\n ]\n}\n\n/**\n * Parse an ST_Matrix3D attribute (12 or 16 tokens with trailing \"0 0 0 1\").\n * Returns the first 12 tokens when valid, `null` when malformed (caller\n * ignores the transform instead of baking NaN — mirrors the host tolerance\n * contract).\n */\nfunction parseTransformAttr(raw: string | null): readonly number[] | null {\n if (!raw) return null\n const t = raw.trim().split(/\\s+/).map(Number)\n const valid =\n t.length === 12 ||\n (t.length === 16 && t[12] === 0 && t[13] === 0 && t[14] === 0 && t[15] === 1)\n if (!valid || !t.every((n) => Number.isFinite(n))) return null\n return t.length === 12 ? t : t.slice(0, 12)\n}\n\n/** One parsed 3MF object instance: triangle soup in mm base (unit-scaled). */\nexport interface ThreemfObject {\n /** The `<object id>` this instance instantiates (leaf object id). */\n id: number\n /**\n * P4 Bambu:实例所属的最上层 build-item 父对象 id(组件容器逐层展开时保留\n * 顶层父)。非 Bambu / resources 直出实例为 undefined。宿主据此把叶子\n * object 关联到 model_settings.config 的 Bambu 对象(objectId 同源)。\n */\n parentObjectId?: number\n /**\n * P4 Bambu:父对象 `<components>` 中的 1-based 序号(父对象多子时区分)。\n * 与 Bambu part 序号同源(Bambu 导出惯例:component 序 ↔ part 序)。\n */\n componentIndex?: number\n /** The object's `<object name>` (Bambu exports a human label here). */\n name?: string\n positions: Float32Array\n indices: Uint32Array\n /**\n * Basematerials display color, `[r, g, b]` in 0..1 (sRGB components as\n * written in the file, matching the host's `setStyle(…, SRGBColorSpace)`).\n * Set when every triangle of the object references the *same* base index;\n * multi-base objects cannot be expressed by a single color → undefined\n * (host falls back to the default material).\n */\n baseColor?: readonly [number, number, number]\n /**\n * Colorgroup vertex colors, one RGB triple per emitted vertex — the geometry\n * is *expanded* (each triangle owns 3 independent vertices, indices are\n * sequential) whenever a colorgroup is referenced, so per-triangle\n * p1/p2/p3 colors survive without shared-vertex conflicts. Length equals\n * `positions.length`.\n */\n vertexColors?: Float32Array\n /**\n * Per-triangle base-material groups (P4, 3MF Core `<triangle pid p1..p3>`\n * with p1=p2=p3 referencing a `<basematerials>` base): maximal runs of\n * consecutive triangles sharing one base index, each with that base's\n * display color. Triangles with mixed p1/p2/p3 (vertex-attribute\n * interpolation) are skipped. Multi-base objects surface here instead of a\n * single `baseColor`.\n */\n materialGroups?: Array<{ start: number; count: number; color: [number, number, number] }>\n /**\n * 零件级说明性元数据(设计文档 2026-10-05-meta §5.1):`name` 来自\n * `<object name>`;`partNumber` 来自 `<object partnumber>`;`metadata` 来自\n * `<object><metadatagroup><metadata name>…`(键保留命名空间前缀)。组件实例\n * (component 容器)只带对所引用对象的 meta 拷贝。\n */\n meta?: ShapeMeta\n}\n\n/** Structured 3MF parse result. */\nexport interface ThreemfArchive {\n /** The declared `<model unit>` mapped to a faijs UnitName. */\n unit: UnitName\n /** One object per build `<item>` (transform baked), or per `<resources>` object. */\n objects: ThreemfObject[]\n /** Every non-model archive entry (key → raw bytes) for downstream consumers. */\n extraEntries: Map<string, Uint8Array>\n /** P4:根 model 文档(3D/3dmodel.model)XML——Bambu 层解析 build/组件结构用。 */\n modelXml?: string\n /** 整体级元数据(设计文档 2026-10-meta 表中的 3MF model context;`<model><metadata>`)。 */\n fileMeta?: FileMeta\n}\n\n/** Detect triangle-level material attributes (fast-3mf port). */\nconst TRI_MATERIAL_ATTR_RE = /(?:^|\\s)(?:p1|p2|p3|pid)=\"/\n\n/**\n * Loose vertex re-parse: extracts x/y/z independently, tolerating attribute\n * reordering or newlines inside a vertex tag. Slow path — only used when the\n * strict regex scan reports a count mismatch (fast-3mf port).\n */\nfunction parseVerticesLoose(vertSec: string): Float32Array | null {\n const vRe = /<vertex\\s+([^>]*?)\\/?>/g\n const positions: number[] = []\n let vm: RegExpExecArray | null\n while ((vm = vRe.exec(vertSec)) !== null) {\n const a = vm[1]\n const x = /(?:^|\\s)x=\"(-?[\\d.eE+-]+)\"/.exec(a)?.[1]\n const y = /(?:^|\\s)y=\"(-?[\\d.eE+-]+)\"/.exec(a)?.[1]\n const z = /(?:^|\\s)z=\"(-?[\\d.eE+-]+)\"/.exec(a)?.[1]\n if (x === undefined || y === undefined || z === undefined) return null\n positions.push(+x, +y, +z)\n }\n return new Float32Array(positions)\n}\n\n/**\n * Loose triangle re-parse: extracts v1/v2/v3 (and pid/p1/p2/p3 when needed)\n * per attribute, tolerating attribute reordering (fast-3mf port). Slow path —\n * only used when the strict regex scan reports a count mismatch.\n */\nfunction parseTrianglesLoose(\n triSec: string,\n withProps: boolean,\n): { index: Uint32Array; props: TriMaterialProps[] | null } | null {\n const tFullRe = /<triangle\\s+([^>]*?)\\/?>/g\n const idx: number[] = []\n const props: TriMaterialProps[] = []\n let tm: RegExpExecArray | null\n while ((tm = tFullRe.exec(triSec)) !== null) {\n const a = tm[1]\n const v1 = /(?:^|\\s)v1=\"(\\d+)\"/.exec(a)?.[1]\n const v2 = /(?:^|\\s)v2=\"(\\d+)\"/.exec(a)?.[1]\n const v3 = /(?:^|\\s)v3=\"(\\d+)\"/.exec(a)?.[1]\n if (v1 === undefined || v2 === undefined || v3 === undefined) return null\n idx.push(+v1, +v2, +v3)\n if (withProps) {\n const p: TriMaterialProps = {}\n const pid = /(?:^|\\s)pid=\"([^\"]*)\"/.exec(a)?.[1]\n if (pid !== undefined) p.pid = pid\n const p1 = /(?:^|\\s)p1=\"([^\"]*)\"/.exec(a)?.[1]\n if (p1 !== undefined) p.p1 = +p1\n const p2 = /(?:^|\\s)p2=\"([^\"]*)\"/.exec(a)?.[1]\n if (p2 !== undefined) p.p2 = +p2\n const p3 = /(?:^|\\s)p3=\"([^\"]*)\"/.exec(a)?.[1]\n if (p3 !== undefined) p.p3 = +p3\n props.push(p)\n }\n }\n return { index: new Uint32Array(idx), props: withProps ? props : null }\n}\n\n/**\n * Stream-scan one model XML document for `<resources>` material libraries and\n * `<object>` entries, merging into the shared maps (caller keeps sub-models\n * first / root last so the root wins id collisions).\n *\n * Text-scanner (no DOM) — ported from the host's retired fast-3mf parser, so\n * very large model documents (Bambu exports reach ~140 MB of XML, where a full\n * DOM parse exhausts the heap) stay linear in memory. Attribute extraction\n * keeps fast-3mf's tolerance: attribute reordering / newline variance falls\n * back to a loose re-parse; namespace-prefixed attributes (`p:objectid`,\n * `p:transform`) match through substring.\n */\nfunction scanResources(\n xml: string,\n scale: number,\n basematerialsById: Map<string, { name?: string; displaycolor?: string }[]>,\n colorgroupsById: Map<string, Float32Array>,\n byObjectId: Map<number, ObjectMeshMeta>,\n): void {\n const resourcesStart = xml.indexOf('<resources>')\n if (resourcesStart < 0) return\n const resourcesEnd = xml.indexOf('</resources>', resourcesStart)\n const resBody = resourcesEnd >= 0\n ? xml.slice(resourcesStart, resourcesEnd)\n : xml.slice(resourcesStart)\n\n // basematerials: id + base list (name/displaycolor).\n const bmRe = /<basematerials\\s+([^>]*)>([\\s\\S]*?)<\\/basematerials>/g\n let m: RegExpExecArray | null\n while ((m = bmRe.exec(resBody)) !== null) {\n const id = /(?:^|\\s)id=\"([^\"]+)\"/.exec(m[1])?.[1]\n if (id === undefined) continue\n const bases: { name?: string; displaycolor?: string }[] = []\n const baseRe = /<base\\s+([^>]*?)\\/?>/g\n let bm2: RegExpExecArray | null\n while ((bm2 = baseRe.exec(m[2])) !== null) {\n bases.push({\n name: /(?:^|\\s)name=\"([^\"]*)\"/.exec(bm2[1])?.[1],\n displaycolor: /(?:^|\\s)displaycolor=\"([^\"]*)\"/.exec(bm2[1])?.[1],\n })\n }\n basematerialsById.set(id, bases)\n }\n\n // colorgroup: id + color list (hex → sRGB components).\n const cgRe = /<colorgroup\\s+([^>]*)>([\\s\\S]*?)<\\/colorgroup>/g\n while ((m = cgRe.exec(resBody)) !== null) {\n const id = /(?:^|\\s)id=\"([^\"]+)\"/.exec(m[1])?.[1]\n if (id === undefined) continue\n const colors: number[] = []\n const colorRe = /<color\\s+([^>]*?)\\/?>/g\n let cm: RegExpExecArray | null\n while ((cm = colorRe.exec(m[2])) !== null) {\n const hex = /(?:^|\\s)color=\"([^\"]*)\"/.exec(cm[1])?.[1]?.slice(0, 7) ?? '#000000'\n const rgb = hexToRgb(hex) ?? [0, 0, 0]\n colors.push(rgb[0], rgb[1], rgb[2])\n }\n colorgroupsById.set(id, new Float32Array(colors))\n }\n\n // objects — scanned across the whole document (not just `<resources>`) so\n // out-of-resources `<object>` placements still load (external-data tolerance).\n const objRe = /<object\\s+([^>]*)>([\\s\\S]*?)<\\/object>/g\n while ((m = objRe.exec(xml)) !== null) {\n const attrs = m[1]\n const body = m[2]\n const idRaw = /(?:^|\\s)id=\"([^\"]+)\"/.exec(attrs)?.[1]\n if (idRaw === undefined) continue\n const id = Number(idRaw)\n if (!Number.isInteger(id)) continue\n const name = /(?:^|\\s)name=\"([^\"]*)\"/.exec(attrs)?.[1]\n const objPid = /(?:^|\\s)pid=\"([^\"]*)\"/.exec(attrs)?.[1]\n const objPindexRaw = /(?:^|\\s)pindex=\"([^\"]*)\"/.exec(attrs)?.[1]\n const objPindex = objPindexRaw !== undefined && objPindexRaw !== '' ? Number(objPindexRaw) : undefined\n // 料号(`<object partnumber>`)。\n const partNumber = /(?:^|\\s)partnumber=\"([^\"]*)\"/.exec(attrs)?.[1]\n // 对象级 `<metadatagroup><metadata name=\"ns:key\">…`(vendor 前缀键,值取 text 或 name)。\n // faijs 写出的 `faijs:description` 提升为对象级 `description`(§6.1 写回 §5.1 读,\n // 保证 description 往返不落进自定义键);其余键保留原始名进 metadata。\n const metadata: Record<string, string> = {}\n let objectDescription: string | undefined\n const mgRe = /<metadatagroup[^>]*>([\\s\\S]*?)<\\/metadatagroup>/g\n let mgm: RegExpExecArray | null\n while ((mgm = mgRe.exec(body)) !== null) {\n const mdRe = /<metadata\\s+([^>]*?)(?:\\/>|>([\\s\\S]*?)<\\/metadata>)/g\n let mdm: RegExpExecArray | null\n while ((mdm = mdRe.exec(mgm[1])) !== null) {\n const key = /(?:^|\\s)name=\"([^\"]*)\"/.exec(mdm[1])?.[1]\n if (key === undefined) continue\n const text = mdm[2] !== undefined ? /(?:^|\\s)value=\"([^\"]*)\"/.exec(mdm[1])?.[1] : undefined\n const val =\n text ??\n (mdm[2] !== undefined ? mdm[2].replace(/<[^>]*>/g, '').trim() : undefined)\n if (val === undefined) continue\n if (key === 'faijs:description') objectDescription = val\n else metadata[key] = val\n }\n }\n\n let meta: ObjectMeshMeta = {\n id,\n name,\n description: objectDescription,\n partNumber,\n metadata,\n pid: objPid,\n pindex: objPindex,\n }\n\n // mesh: vertices + triangles (fast-3mf port — strict regex scan with a\n // loose attribute-order fallback; missing sub-sections are tolerated and\n // the object still registers, matching the retired host behavior).\n const meshStart = body.indexOf('<mesh>')\n const meshEnd = body.indexOf('</mesh>')\n if (meshStart >= 0 && meshEnd > meshStart) {\n const meshBody = body.slice(meshStart, meshEnd)\n\n // vertices\n const vertStart = meshBody.indexOf('<vertices>')\n const vertEnd = meshBody.indexOf('</vertices>')\n if (vertStart >= 0 && vertEnd > vertStart) {\n const vertSec = meshBody.slice(vertStart, vertEnd)\n let vc = 0\n let p = 0\n while ((p = vertSec.indexOf('<vertex ', p)) !== -1) { vc++; p += 8 }\n const vRe = /x=\"(-?[\\d.eE+-]+)\"\\s+y=\"(-?[\\d.eE+-]+)\"\\s+z=\"(-?[\\d.eE+-]+)\"/g\n let positions = new Float32Array(vc * 3)\n let vm: RegExpExecArray | null\n let vi = 0\n while ((vm = vRe.exec(vertSec)) !== null) {\n positions[vi] = +vm[1] * scale\n positions[vi + 1] = +vm[2] * scale\n positions[vi + 2] = +vm[3] * scale\n vi += 3\n }\n // XML attributes are unordered (spec XSD) — if any vertex failed to\n // match (different attribute order / newline after tag), re-scan each\n // attribute independently instead of giving up.\n if (vc > 0 && vi !== vc * 3) {\n const loose = parseVerticesLoose(vertSec)\n if (!loose) {\n throw new Error(`[mesh/threemf] cannot parse <vertices> in object ${id}`)\n }\n positions = new Float32Array(loose.length)\n for (let i = 0; i < loose.length; i++) positions[i] = loose[i] * scale\n }\n meta = { ...meta, positions }\n }\n\n // triangles\n const triStart = meshBody.indexOf('<triangles>')\n const triEnd = meshBody.indexOf('</triangles>')\n if (triStart >= 0 && triEnd > triStart) {\n const triSec = meshBody.slice(triStart, triEnd)\n let tc = 0\n let p = 0\n while ((p = triSec.indexOf('<triangle ', p)) !== -1) { tc++; p += 10 }\n const idx = new Uint32Array(tc * 3)\n const hasMatAttrs = TRI_MATERIAL_ATTR_RE.test(triSec)\n // Object-level pid without per-triangle material attrs: synthesize\n // triangle properties so every triangle still routes through the\n // resource (object pindex default) — fast-3mf semantics.\n const needsProps = hasMatAttrs || objPid !== undefined\n const triProps: TriMaterialProps[] | undefined = needsProps ? [] : undefined\n const tRe = /v1=\"(\\d+)\"\\s+v2=\"(\\d+)\"\\s+v3=\"(\\d+)\"/g\n let tm: RegExpExecArray | null\n let ti = 0\n while ((tm = tRe.exec(triSec)) !== null) {\n idx[ti] = +tm[1]\n idx[ti + 1] = +tm[2]\n idx[ti + 2] = +tm[3]\n ti += 3\n }\n if (tc > 0 && ti !== tc * 3) {\n // Attribute order / newline variance → re-scan each attribute\n // independently (slow path, rare).\n const loose = parseTrianglesLoose(triSec, needsProps)\n if (!loose) {\n throw new Error(`[mesh/threemf] cannot parse <triangles> in object ${id}`)\n }\n idx.set(loose.index)\n if (loose.props) {\n triProps!.length = 0\n triProps!.push(...loose.props)\n }\n } else if (needsProps) {\n if (hasMatAttrs) {\n const tFullRe = /<triangle\\s+([^>]*?)\\/?>/g\n let tfm: RegExpExecArray | null\n while ((tfm = tFullRe.exec(triSec)) !== null) {\n const a = tfm[1]\n const tv = /v1=\"(\\d+)\"\\s+v2=\"(\\d+)\"\\s+v3=\"(\\d+)\"/.exec(a)\n if (!tv) continue\n const prop: TriMaterialProps = {}\n const p1 = /\\bp1=\"([^\"]*)\"/.exec(a)?.[1]\n if (p1 !== undefined) prop.p1 = +p1\n const p2 = /\\bp2=\"([^\"]*)\"/.exec(a)?.[1]\n if (p2 !== undefined) prop.p2 = +p2\n const p3 = /\\bp3=\"([^\"]*)\"/.exec(a)?.[1]\n if (p3 !== undefined) prop.p3 = +p3\n const pidm = /\\bpid=\"([^\"]*)\"/.exec(a)?.[1]\n if (pidm !== undefined) prop.pid = pidm\n triProps!.push(prop)\n }\n } else {\n // Object-level pid only → synthesized props (no per-triangle\n // material attrs) so materializeMesh's per-triangle lookups fall\n // through to the object-level defaults.\n for (let i = 0; i < tc; i++) triProps!.push({})\n }\n }\n meta = { ...meta, indices: idx, triProps }\n }\n }\n\n // `<components>` children — Bambu builds plates/assemblies this way.\n // A pure component container has no mesh; it still registers in byObjectId\n // so build items referencing it expand recursively (component instances).\n const compStart = body.indexOf('<components>')\n if (compStart >= 0) {\n const compEnd = body.indexOf('</components>', compStart)\n const compSec = compEnd >= 0\n ? body.slice(compStart + '<components>'.length, compEnd)\n : body.slice(compStart + '<components>'.length)\n const comps: ObjectComponent[] = []\n const compRe = /<component\\s+([^>]*?)\\/?>/g\n let cpm: RegExpExecArray | null\n while ((cpm = compRe.exec(compSec)) !== null) {\n const oid = Number(/objectid=\"([^\"]+)\"/.exec(cpm[1])?.[1])\n if (!Number.isInteger(oid)) continue\n comps.push({\n objectId: oid,\n transform: parseTransformAttr(/\\btransform=\"([^\"]*)\"/.exec(cpm[1])?.[1] ?? null),\n })\n }\n if (comps.length > 0) meta = { ...meta, components: comps }\n }\n\n if (!meta.positions && !meta.components) continue\n byObjectId.set(id, meta)\n }\n}\n\n/** 3MF Core well-known model-level metadata names → FileMeta 字段映射。 */\ntype FileMetaStringKey = Exclude<keyof FileMeta, 'metadata'>\nconst MODEL_METADATA_FIELD: Record<string, FileMetaStringKey> = {\n Title: 'title',\n Designer: 'designer',\n Description: 'description',\n Copyright: 'copyright',\n LicenseTerms: 'licenseTerms',\n Rating: 'rating',\n CreationDate: 'creationDate',\n ModificationDate: 'modificationDate',\n Application: 'application',\n}\n\n/**\n * Parse `FileMeta` from the root model document's direct `<metadata>` children\n * (3MF Core model context). Well-known names (Title/Designer/…) map onto the\n * FileMeta fields; any other (vendor-namespaced) name is kept verbatim in\n * `FileMeta.metadata` (key preserves its namespace prefix). Value = text\n * content or a `value` attribute; empties are skipped.\n */\nfunction parseModelMetadata(rootDoc: string): FileMeta | undefined {\n // 仅取 `<model …>` 到 `<resources>`/`<build>` 之前的前导区段——模型级元数据\n // 是 `<model>` 的直接子级,排在 `<resources>` 之前;避免把对象级/metadatagroup\n // 里的同名 `<metadata>` 误收进 fileMeta。\n const modelStart = rootDoc.indexOf('<model')\n if (modelStart < 0) return undefined\n const resAt = rootDoc.indexOf('<resources>', modelStart)\n const buildAt = rootDoc.indexOf('<build', modelStart)\n const endCandidates = [resAt, buildAt].filter((i) => i >= 0)\n const sectionEnd = endCandidates.length > 0 ? Math.min(...endCandidates) : rootDoc.length\n const section = rootDoc.slice(modelStart, sectionEnd)\n\n const meta: FileMeta = {}\n let custom: Record<string, string> | undefined\n const mdRe = /<metadata\\s+([^>]*?)(?:\\/>|>([\\s\\S]*?)<\\/metadata>)/g\n let mdm: RegExpExecArray | null\n while ((mdm = mdRe.exec(section)) !== null) {\n const attrs = mdm[1]\n const name = /(?:^|\\s)name=\"([^\"]*)\"/.exec(attrs)?.[1]\n if (name === undefined) continue\n const valAttr = /(?:^|\\s)value=\"([^\"]*)\"/.exec(attrs)?.[1]\n const val = valAttr ?? (mdm[2] !== undefined ? mdm[2].replace(/<[^>]*>/g, '').trim() : '')\n if (val === '') continue\n const field = MODEL_METADATA_FIELD[name]\n if (field) {\n meta[field] = val\n } else {\n custom = custom ?? {}\n custom[name] = val\n }\n }\n if (custom && Object.keys(custom).length > 0) meta.metadata = custom\n return Object.keys(meta).length > 0 ? meta : undefined\n}\n\n/**\n * Parse the 3MF model XML documents (root + sub-models) into archive objects.\n * skeletons (component containers) plus the `<build>`, while the actual mesh\n * geometry lives in per-object files `3D/Objects/object_*.model` referenced\n * through `p:path` (production extension) — which we ignore in favor of\n * merging every model document's `<resources>` by object id (mirrors the\n * host's fast-3mf collection order: sub-models first, root model last, root\n * wins on id collisions).\n *\n * `unit` is read from the ROOT model document (the file the build items\n * belong to); all documents share the same declared unit in practice.\n */\nfunction parseModelXml(docTexts: string[]): {\n unitName: UnitName\n objects: ThreemfObject[]\n fileMeta?: FileMeta\n} {\n // Last document = root model (caller appends it last).\n const rootDoc = docTexts[docTexts.length - 1]\n const unitMatch = /<model\\b[^>]*\\bunit=\"([^\"]+)\"/.exec(rootDoc)\n const unit = unitMatch ? unitMatch[1] : 'millimeter'\n const unitName = threemfUnitToFaijs(unit)\n if (unitName === null) {\n throw new Error(`[mesh/threemf] unsupported <model unit>: ${JSON.stringify(unit)}`)\n }\n const scale = UNIT_SCALE[unitName]\n\n // 整体级元数据(`<model>` 直接子级 `<metadata>`;well-known 名映射到\n // FileMeta 字段,vendor 前缀名兜底进 FileMeta.metadata)。\n const fileMeta = parseModelMetadata(rootDoc)\n\n // resources → material libraries (basematerials / colorgroup) + objects,\n // merged across every model document (sub-models first, root last).\n const basematerialsById = new Map<string, { name?: string; displaycolor?: string }[]>()\n const colorgroupsById = new Map<string, Float32Array>()\n const byObjectId = new Map<number, ObjectMeshMeta>()\n\n for (const text of docTexts) {\n scanResources(text, scale, basematerialsById, colorgroupsById, byObjectId)\n }\n // (scanResources above handles basematerials / colorgroup / objects)\n // (mesh/components + registration handled by scanResources)\n\n /**\n * Materialize object instances: a mesh object yields ONE ThreemfObject with\n * the transform baked in and base/vertex colors resolved; a component\n * container recursively expands each child (composing transforms, child\n * applied first), one ThreemfObject per leaf mesh instance — mirroring the\n * host's clone-and-apply semantics without shared geometry. `path` guards\n * reference cycles (a self-referencing component chain terminates).\n */\n function materialize(\n src: ObjectMeshMeta,\n mat: readonly number[] | undefined,\n path: Set<number>,\n parentObjectId?: number,\n componentIndex?: number,\n ): ThreemfObject[] {\n if (src.positions && src.indices) {\n return [materializeMesh(src, mat, parentObjectId, componentIndex)]\n }\n if (src.components && src.components.length > 0) {\n const out: ThreemfObject[] = []\n for (let i = 0; i < src.components.length; i++) {\n const comp = src.components[i]\n if (path.has(comp.objectId)) continue\n const ref = byObjectId.get(comp.objectId)\n if (!ref) continue\n const next = comp.transform\n ? (mat ? composeTransform(mat, comp.transform) : comp.transform)\n : mat\n const nextPath = new Set(path)\n nextPath.add(comp.objectId)\n // P4:把 build-item 的父对象 id 与组件序号透传到每个叶子实例——\n // 嵌套组件逐层展开时沿用同一父(父 identity 属于 build item)。\n const leafParentId = parentObjectId ?? src.id\n const leafCompIndex = componentIndex ?? i + 1\n out.push(...materialize(ref, next, nextPath, leafParentId, leafCompIndex))\n }\n return out\n }\n return []\n }\n\n /**\n * Materialize a single mesh object instance: bake the optional build\n * transform and resolve base/vertex colors. `vertexColors` expands the\n * geometry (each triangle owns 3 independent vertices) so per-triangle\n * p1/p2/p3 survive; `baseColor` keeps the compact form and applies only\n * when every triangle references the same base index (multi-base objects\n * fall back to the default material, matching the host contract).\n */\n /** 组装零件级 meta(仅当至少一个字段存在)。\n * 组件容器(component 引用)沿 ref 链透传同一 meta 对象引用。 */\n function srcMeta(src: ObjectMeshMeta): ShapeMeta | undefined {\n const meta: ShapeMeta = {}\n if (src.name !== undefined && src.name !== '') meta.name = src.name\n if (src.description !== undefined && src.description !== '') meta.description = src.description\n if (src.partNumber !== undefined && src.partNumber !== '') meta.partNumber = src.partNumber\n if (src.metadata && Object.keys(src.metadata).length > 0) meta.metadata = src.metadata\n return Object.keys(meta).length > 0 ? meta : undefined\n }\n\n function materializeMesh(\n src: ObjectMeshMeta,\n mat?: readonly number[],\n parentObjectId?: number,\n componentIndex?: number,\n ): ThreemfObject {\n const positions = src.positions!\n const indices = src.indices!\n let pid: string | undefined\n if (src.triProps) {\n for (const p of src.triProps) {\n const eff = p.pid ?? src.pid\n if (eff !== undefined) { pid = eff; break }\n }\n } else {\n pid = src.pid\n }\n\n const cg = pid !== undefined ? colorgroupsById.get(pid) : undefined\n if (cg) {\n const triCount = indices.length / 3\n const outPos = new Float32Array(triCount * 9)\n const outCol = new Float32Array(triCount * 9)\n const outIdx = new Uint32Array(triCount * 3)\n const objectPindex = src.pindex\n for (let t = 0; t < triCount; t++) {\n const v1 = indices[t * 3]\n const v2 = indices[t * 3 + 1]\n const v3 = indices[t * 3 + 2]\n const tp = src.triProps ? src.triProps[t] : undefined\n const p1 = tp?.p1 ?? objectPindex ?? 0\n const p2 = tp?.p2 ?? p1\n const p3 = tp?.p3 ?? p1\n // vertex-contiguous layout (x1 y1 z1 x2 y2 z2 x3 y3 z3 / R1 G1 B1 …):\n // each emitted vertex owns 3 consecutive components.\n const vs = [v1, v2, v3]\n const ps = [p1, p2, p3]\n for (let k = 0; k < 3; k++) {\n const sv = vs[k]\n const sp = ps[k]\n outPos[t * 9 + k * 3] = positions[sv * 3]\n outPos[t * 9 + k * 3 + 1] = positions[sv * 3 + 1]\n outPos[t * 9 + k * 3 + 2] = positions[sv * 3 + 2]\n outCol[t * 9 + k * 3] = cg[sp * 3]\n outCol[t * 9 + k * 3 + 1] = cg[sp * 3 + 1]\n outCol[t * 9 + k * 3 + 2] = cg[sp * 3 + 2]\n }\n outIdx[t * 3] = t * 3\n outIdx[t * 3 + 1] = t * 3 + 1\n outIdx[t * 3 + 2] = t * 3 + 2\n }\n return {\n id: src.id,\n name: src.name,\n positions: mat ? bakeTransform(outPos, mat) : outPos,\n indices: outIdx,\n vertexColors: outCol,\n ...(parentObjectId !== undefined ? { parentObjectId, componentIndex: componentIndex ?? 1 } : {}),\n ...(srcMeta(src) ? { meta: srcMeta(src) } : {}),\n }\n }\n\n const bases = pid !== undefined ? basematerialsById.get(pid) : undefined\n if (bases && bases.length > 0) {\n const idx0 = src.triProps ? (src.triProps[0]?.p1 ?? src.pindex ?? 0) : (src.pindex ?? 0)\n let same = true\n let refKey = ''\n if (src.triProps) {\n for (const tp of src.triProps) {\n const effPid = tp.pid ?? src.pid\n const key = effPid !== undefined ? `${effPid}:${tp.p1 ?? src.pindex ?? 0}` : ''\n if (refKey === '') refKey = key\n else if (key !== refKey) {\n same = false\n break\n }\n }\n } else {\n refKey = pid !== undefined ? `${pid}:${src.pindex ?? 0}` : ''\n }\n const base = bases[idx0]\n // baseColor 只对「全部三角形同一 (pid, base)」的对象设置(P2 单色便捷\n // 字段);无材质三角形或混合 pid/base 的对象 → undefined(走 materialGroups)。\n const baseColor = same && refKey !== '' && base?.displaycolor\n ? hexToRgb(base.displaycolor.slice(0, 7))\n : undefined\n // P4(3MF Core 逐三角形材质):p1=p2=p3 的三角形按(有效 pid, base 索引)\n // 分组成 materialGroups(连续三角形区间 + 该 base 的 displaycolor);\n // 无材质(对象与三角形均无 pid)、混合 p1/p2/p3(顶点属性插值)跳过。\n // 同色对象仍走 baseColor 便捷字段(P2 兼容);多 base 对象在\n // materialGroups 表达(baseColor undefined)。\n const groups: Array<{ start: number; count: number; color: [number, number, number] }> = []\n const triProps = src.triProps\n const triCount = triProps?.length ?? indices.length / 3\n if (triProps) {\n let runStart = -1\n let runKey = ''\n let runColor: [number, number, number] | undefined\n const flush = (end: number): void => {\n if (runStart >= 0 && runColor) {\n groups.push({ start: runStart, count: end - runStart, color: runColor })\n }\n runStart = -1\n runKey = ''\n runColor = undefined\n }\n for (let t = 0; t < triCount; t++) {\n const tp: TriMaterialProps | undefined = triProps[t]\n let key = ''\n let color: [number, number, number] | undefined\n if (tp) {\n const effPid = tp.pid ?? src.pid\n if (effPid !== undefined) {\n const bases = basematerialsById.get(effPid)\n const bi = tp.p1 ?? src.pindex ?? 0\n if (bases && bi >= 0 && bi < bases.length && tp.p1 === tp.p2 && tp.p2 === tp.p3) {\n const c = bases[bi]?.displaycolor\n if (c) {\n key = `${effPid}:${bi}`\n const rgb = hexToRgb(c.slice(0, 7))\n if (rgb) color = [rgb[0], rgb[1], rgb[2]]\n }\n }\n }\n }\n if (key !== '' && key === runKey) continue\n flush(t)\n if (key !== '') {\n runStart = t\n runKey = key\n runColor = color\n }\n }\n flush(triCount)\n }\n // 单一分组且覆盖全部三角形 = 单色对象 → 走 baseColor(P2 便捷字段),\n // 不挂 materialGroups(避免冗余双表达);仅部分覆盖或多组才用 materialGroups。\n const singleFull =\n groups.length === 1 && groups[0].start === 0 && groups[0].count === triCount\n return {\n id: src.id,\n name: src.name,\n positions: mat ? bakeTransform(positions, mat) : positions,\n indices,\n baseColor: baseColor ?? undefined,\n ...(!singleFull && groups.length > 0 ? { materialGroups: groups } : {}),\n ...(parentObjectId !== undefined ? { parentObjectId, componentIndex: componentIndex ?? 1 } : {}),\n ...(srcMeta(src) ? { meta: srcMeta(src) } : {}),\n }\n }\n\n return {\n id: src.id,\n name: src.name,\n positions: mat ? bakeTransform(positions, mat) : positions,\n indices,\n ...(parentObjectId !== undefined ? { parentObjectId, componentIndex: componentIndex ?? 1 } : {}),\n ...(srcMeta(src) ? { meta: srcMeta(src) } : {}),\n }\n }\n\n // build → item → per-instance transforms baked to world space.\n // `<build>` lives in the ROOT model document only.\n const buildMatch = /<build\\b[^>]*>/.exec(rootDoc)\n let buildSec = ''\n if (buildMatch) {\n const buildStart = buildMatch.index\n const buildEnd = rootDoc.indexOf('</build>', buildStart)\n buildSec = buildEnd >= 0 ? rootDoc.slice(buildStart, buildEnd) : rootDoc.slice(buildStart)\n }\n const itemRe = /<item\\b[^>]*>/g\n const out: ThreemfObject[] = []\n let itemCount = 0\n let im: RegExpExecArray | null\n while ((im = itemRe.exec(buildSec)) !== null) {\n itemCount++\n const attrs = im[0]\n const objId = Number(/(?:^|\\s)objectid=\"([^\"]+)\"/.exec(attrs)?.[1])\n const src = byObjectId.get(objId)\n if (!src) continue\n // ST_Matrix3D: 4×3 (12) or 4×4 (16) whose trailing row is \"0 0 0 1\";\n // malformed transforms are IGNORED (identity) — never bake NaN into\n // geometry (mirrors the host's fast-3mf tolerance contract).\n const tokens = parseTransformAttr(/\\btransform=\"([^\"]*)\"/.exec(attrs)?.[1] ?? null)\n // parentObjectId=objId;componentIndex 留给 materialize 按组件序推导(undefined)。\n out.push(...materialize(src, tokens ?? undefined, new Set([objId]), objId, undefined))\n }\n if (itemCount === 0) {\n // No build items: emit every `<resources>` object directly (¶ the empty\n // `<build>` contract — NOT a fallback; see plan §8 decision 8).\n for (const src of byObjectId.values()) {\n out.push(...materialize(src, undefined, new Set([src.id])))\n }\n }\n\n if (out.length === 0) {\n throw new Error('[mesh/threemf] no buildable geometry found in 3dmodel.model')\n }\n return { unitName, objects: out, ...(fileMeta ? { fileMeta } : {}) }\n}\n\n/**\n * Parse 3MF bytes into a structured archive.\n *\n * Supports Bambu's multi-file layout: `3D/3dmodel.model` (root, holds the\n * `<build>` and component-container skeletons) plus per-object sub-models\n * `3D/Objects/*.model` whose `<resources>` are merged by object id\n * (sub-models first, root last — root wins collisions).\n *\n * @param buffer - the raw .3mf (ZIP) bytes.\n * @returns an `ThreemfArchive` with mm-base per-instance objects, the declared\n * source unit, and every non-model archive entry.\n * @throws when the buffer is not a 3MF/ZIP archive or the unit is invalid.\n */\nexport async function parseThreemf(buffer: ArrayBuffer): Promise<ThreemfArchive> {\n let entries: Map<string, Uint8Array>\n try {\n entries = readZipEntries(new Uint8Array(buffer))\n } catch {\n throw new Error('[mesh/threemf] not a valid 3MF ZIP archive')\n }\n const rootKey = [...entries.keys()].find((k) => k.toLowerCase() === '3d/3dmodel.model')\n if (!rootKey) {\n throw new Error('[mesh/threemf] missing 3D/3dmodel.model entry')\n }\n\n // Sub-model documents first (fast-3mf collection order), root model last.\n const docKeys: string[] = []\n for (const k of entries.keys()) {\n if (k.toLowerCase() === rootKey.toLowerCase()) continue\n if (/^3d\\/.+\\/[^/]+\\.model$/i.test(k)) docKeys.push(k)\n }\n docKeys.push(rootKey)\n const docTexts = docKeys.map((k) => new TextDecoder().decode(entries.get(k)!))\n const parsed = parseModelXml(docTexts)\n\n // `extraEntries` = everything that is NOT a model document — Bambu's\n // `Metadata/model_settings.config`, `Metadata/project_settings.config`,\n // `Metadata/thumbnail.png`, etc.\n const extraEntries = new Map<string, Uint8Array>()\n for (const [k, v] of entries) {\n if (/\\.model$/i.test(k)) continue\n extraEntries.set(k, v)\n }\n\n return {\n unit: parsed.unitName,\n objects: parsed.objects,\n extraEntries,\n // P4:根 model XML(Bambu 层解析 build items / 父对象 components 需要;\n // 根 model 不在 extraEntries——extraEntries 只收非 model 条目)。\n ...(rootKey ? { modelXml: new TextDecoder().decode(entries.get(rootKey)!) } : {}),\n ...(parsed.fileMeta ? { fileMeta: parsed.fileMeta } : {}),\n }\n}"]}
@@ -38,7 +38,7 @@ export declare function rotate_euler(shape: Shape, angles: Vec3, pivot?: Vec3):
38
38
  */
39
39
  export declare function scale3d(shape: Shape, factor: number | Vec3, center?: Vec3): Shape;
40
40
  /**
41
- * Uniformly scale a mesh shape (brepjs `scale` 契约,P6 §4.6)。后台用
41
+ * Uniformly scale a mesh shape (原 brepjs `scale` 契约,P6 §4.6)。后台用
42
42
  * `scale3d` 的等比参数;`center` 为缩放不动的点,默认原点。
43
43
  * @param shape - the mesh shape to scale.
44
44
  * @param factor - uniform scale factor (> 0).
@@ -56,7 +56,7 @@ export function scale3d(shape, factor, center) {
56
56
  return applyMatrix(shape, scaleMatrix(f, center));
57
57
  }
58
58
  /**
59
- * Uniformly scale a mesh shape (brepjs `scale` 契约,P6 §4.6)。后台用
59
+ * Uniformly scale a mesh shape (原 brepjs `scale` 契约,P6 §4.6)。后台用
60
60
  * `scale3d` 的等比参数;`center` 为缩放不动的点,默认原点。
61
61
  * @param shape - the mesh shape to scale.
62
62
  * @param factor - uniform scale factor (> 0).
@@ -1 +1 @@
1
- {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/mesh/transform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mesh 变换 API\n *\n * 提取来源:\n * - engine/mesh-simplify/proxy-mesh-cache.ts (transformMeshData)\n * - engine-store.partTransforms\n *\n * 变换语义(烘焙执行引擎):\n * - translate/rotate_euler/scale3d 直接烘焙顶点(修改 positions)\n * - 执行器(dispatcher / runtime.execute)调用这些函数将变换烘焙进几何\n * - 交互拖拽期间的预览仍由 partTransforms(渲染层瞬态)承担\n * 确认后由引擎重放语句完成烘焙(P2)\n */\n\nimport * as THREE from 'three'\nimport type { Shape, Vec3 } from './types'\n\n/**\n * Translate a mesh shape by baking the offset into its vertices.\n * @param shape - the mesh shape to translate.\n * @param offset - translation vector in mm.\n * @returns a new shape moved by the given offset.\n */\nexport function translate(shape: Shape, offset: Vec3): Shape {\n const positions = new Float32Array(shape.positions)\n for (let i = 0; i < positions.length; i += 3) {\n positions[i] += offset[0]\n positions[i + 1] += offset[1]\n positions[i + 2] += offset[2]\n }\n return { positions, indices: shape.indices }\n}\n\n/**\n * Rotate a mesh shape by baking the rotation into its vertices (angles in\n * degrees, optionally about a pivot).\n * @param shape - the mesh shape to rotate.\n * @param angles - XYZ Euler angles in degrees.\n * @param pivot - optional rotation pivot point in mm.\n * @returns a new shape with rotated vertices.\n */\nexport function rotate_euler(shape: Shape, angles: Vec3, pivot?: Vec3): Shape {\n const euler = new THREE.Euler(\n (angles[0] * Math.PI) / 180,\n (angles[1] * Math.PI) / 180,\n (angles[2] * Math.PI) / 180,\n )\n const matrix = new THREE.Matrix4().makeRotationFromEuler(euler)\n if (pivot) {\n matrix.premultiply(new THREE.Matrix4().makeTranslation(pivot[0], pivot[1], pivot[2]))\n matrix.multiply(new THREE.Matrix4().makeTranslation(-pivot[0], -pivot[1], -pivot[2]))\n }\n return applyMatrix(shape, matrix)\n}\n\n/**\n * Scale a mesh shape by baking the factor into its vertices.\n * @param shape - the mesh shape to scale.\n * @param factor - uniform scale factor or per-axis (x, y, z) factors.\n * @param center - optional fixed point of the scaling (P6 §4.6; default origin).\n * @returns a new shape with scaled vertices.\n */\nexport function scale3d(shape: Shape, factor: number | Vec3, center?: Vec3): Shape {\n const f: [number, number, number] =\n typeof factor === 'number' ? [factor, factor, factor] : [factor[0], factor[1], factor[2]]\n return applyMatrix(shape, scaleMatrix(f, center))\n}\n\n/**\n * Uniformly scale a mesh shape (brepjs `scale` 契约,P6 §4.6)。后台用\n * `scale3d` 的等比参数;`center` 为缩放不动的点,默认原点。\n * @param shape - the mesh shape to scale.\n * @param factor - uniform scale factor (> 0).\n * @param center - optional fixed point of the scaling (default origin).\n * @returns a new shape with uniformly scaled vertices.\n */\nexport function scale(shape: Shape, factor: number, center?: Vec3): Shape {\n return applyMatrix(shape, scaleMatrix([factor, factor, factor], center))\n}\n\n/** 缩放矩阵:围绕 `center`(缺省原点)构造 T(c)·S·T(−c)。 */\nfunction scaleMatrix(f: [number, number, number], center?: Vec3): THREE.Matrix4 {\n const s = new THREE.Matrix4().makeScale(f[0], f[1], f[2])\n if (!center) return s\n return new THREE.Matrix4()\n .makeTranslation(center[0], center[1], center[2])\n .multiply(s)\n .multiply(new THREE.Matrix4().makeTranslation(-center[0], -center[1], -center[2]))\n}\n\n/** 用 THREE.Matrix4 变换几何 */\nfunction applyMatrix(shape: Shape, matrix: THREE.Matrix4): Shape {\n const positions = new Float32Array(shape.positions)\n const v = new THREE.Vector3()\n for (let i = 0; i < positions.length; i += 3) {\n v.set(positions[i], positions[i + 1], positions[i + 2])\n v.applyMatrix4(matrix)\n positions[i] = v.x\n positions[i + 1] = v.y\n positions[i + 2] = v.z\n }\n return { positions, indices: shape.indices }\n}\n\n/**\n * Transform a mesh shape with an arbitrary THREE.Matrix4 (corresponds to the\n * existing transformMeshData function).\n * @param shape - the mesh shape to transform.\n * @param matrix - the 4x4 transform matrix to apply.\n * @returns a new shape with transformed vertices.\n */\nexport function transformMatrix(shape: Shape, matrix: THREE.Matrix4): Shape {\n return applyMatrix(shape, matrix)\n}\n"]}
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/mesh/transform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mesh 变换 API\n *\n * 提取来源:\n * - engine/mesh-simplify/proxy-mesh-cache.ts (transformMeshData)\n * - engine-store.partTransforms\n *\n * 变换语义(烘焙执行引擎):\n * - translate/rotate_euler/scale3d 直接烘焙顶点(修改 positions)\n * - 执行器(dispatcher / runtime.execute)调用这些函数将变换烘焙进几何\n * - 交互拖拽期间的预览仍由 partTransforms(渲染层瞬态)承担\n * 确认后由引擎重放语句完成烘焙(P2)\n */\n\nimport * as THREE from 'three'\nimport type { Shape, Vec3 } from './types'\n\n/**\n * Translate a mesh shape by baking the offset into its vertices.\n * @param shape - the mesh shape to translate.\n * @param offset - translation vector in mm.\n * @returns a new shape moved by the given offset.\n */\nexport function translate(shape: Shape, offset: Vec3): Shape {\n const positions = new Float32Array(shape.positions)\n for (let i = 0; i < positions.length; i += 3) {\n positions[i] += offset[0]\n positions[i + 1] += offset[1]\n positions[i + 2] += offset[2]\n }\n return { positions, indices: shape.indices }\n}\n\n/**\n * Rotate a mesh shape by baking the rotation into its vertices (angles in\n * degrees, optionally about a pivot).\n * @param shape - the mesh shape to rotate.\n * @param angles - XYZ Euler angles in degrees.\n * @param pivot - optional rotation pivot point in mm.\n * @returns a new shape with rotated vertices.\n */\nexport function rotate_euler(shape: Shape, angles: Vec3, pivot?: Vec3): Shape {\n const euler = new THREE.Euler(\n (angles[0] * Math.PI) / 180,\n (angles[1] * Math.PI) / 180,\n (angles[2] * Math.PI) / 180,\n )\n const matrix = new THREE.Matrix4().makeRotationFromEuler(euler)\n if (pivot) {\n matrix.premultiply(new THREE.Matrix4().makeTranslation(pivot[0], pivot[1], pivot[2]))\n matrix.multiply(new THREE.Matrix4().makeTranslation(-pivot[0], -pivot[1], -pivot[2]))\n }\n return applyMatrix(shape, matrix)\n}\n\n/**\n * Scale a mesh shape by baking the factor into its vertices.\n * @param shape - the mesh shape to scale.\n * @param factor - uniform scale factor or per-axis (x, y, z) factors.\n * @param center - optional fixed point of the scaling (P6 §4.6; default origin).\n * @returns a new shape with scaled vertices.\n */\nexport function scale3d(shape: Shape, factor: number | Vec3, center?: Vec3): Shape {\n const f: [number, number, number] =\n typeof factor === 'number' ? [factor, factor, factor] : [factor[0], factor[1], factor[2]]\n return applyMatrix(shape, scaleMatrix(f, center))\n}\n\n/**\n * Uniformly scale a mesh shape (原 brepjs `scale` 契约,P6 §4.6)。后台用\n * `scale3d` 的等比参数;`center` 为缩放不动的点,默认原点。\n * @param shape - the mesh shape to scale.\n * @param factor - uniform scale factor (> 0).\n * @param center - optional fixed point of the scaling (default origin).\n * @returns a new shape with uniformly scaled vertices.\n */\nexport function scale(shape: Shape, factor: number, center?: Vec3): Shape {\n return applyMatrix(shape, scaleMatrix([factor, factor, factor], center))\n}\n\n/** 缩放矩阵:围绕 `center`(缺省原点)构造 T(c)·S·T(−c)。 */\nfunction scaleMatrix(f: [number, number, number], center?: Vec3): THREE.Matrix4 {\n const s = new THREE.Matrix4().makeScale(f[0], f[1], f[2])\n if (!center) return s\n return new THREE.Matrix4()\n .makeTranslation(center[0], center[1], center[2])\n .multiply(s)\n .multiply(new THREE.Matrix4().makeTranslation(-center[0], -center[1], -center[2]))\n}\n\n/** 用 THREE.Matrix4 变换几何 */\nfunction applyMatrix(shape: Shape, matrix: THREE.Matrix4): Shape {\n const positions = new Float32Array(shape.positions)\n const v = new THREE.Vector3()\n for (let i = 0; i < positions.length; i += 3) {\n v.set(positions[i], positions[i + 1], positions[i + 2])\n v.applyMatrix4(matrix)\n positions[i] = v.x\n positions[i + 1] = v.y\n positions[i + 2] = v.z\n }\n return { positions, indices: shape.indices }\n}\n\n/**\n * Transform a mesh shape with an arbitrary THREE.Matrix4 (corresponds to the\n * existing transformMeshData function).\n * @param shape - the mesh shape to transform.\n * @param matrix - the 4x4 transform matrix to apply.\n * @returns a new shape with transformed vertices.\n */\nexport function transformMatrix(shape: Shape, matrix: THREE.Matrix4): Shape {\n return applyMatrix(shape, matrix)\n}\n"]}
@@ -92,7 +92,7 @@ export declare const NRAD_MAX = 128;
92
92
  */
93
93
  export declare function clampNRad(n: number | undefined): number;
94
94
  /**
95
- * Parameters for creating a box (brepjs `box(width, depth, height, {at?, centered?, segments?})`
95
+ * Parameters for creating a box (原 brepjs `box(width, depth, height, {at?, centered?, segments?})`
96
96
  * contract, §4.1 A 决策). Default: min-corner at the origin. `centered: true` shifts so the
97
97
  * box is centered at the origin; `at` is CENTER semantics and takes precedence over `centered`.
98
98
  */
@@ -103,7 +103,7 @@ export interface BoxParams {
103
103
  depth: number;
104
104
  /** Side length along Z (mm). */
105
105
  height: number;
106
- /** Center position (brepjs `at`, CENTER semantics); takes precedence over `centered`. */
106
+ /** Center position (原 brepjs `at`, CENTER semantics); takes precedence over `centered`. */
107
107
  at?: Vec3;
108
108
  /** Center the box at the origin when `at` is absent. Default: false (min-corner at origin). */
109
109
  centered?: boolean;
@@ -119,13 +119,13 @@ export interface SphereParams {
119
119
  center?: Vec3;
120
120
  nRad?: number;
121
121
  }
122
- /** Parameters for creating a cylinder (brepjs contract, §4.3 A). */
122
+ /** Parameters for creating a cylinder (原 brepjs contract, §4.3 A). */
123
123
  export interface CylinderParams {
124
124
  /** Radius (mm). */
125
125
  radius: number;
126
126
  /** Height along +Z (mm). */
127
127
  height: number;
128
- /** Base circle center (brepjs `at`, BASE semantics; default [0, 0, 0]). */
128
+ /** Base circle center (原 brepjs `at`, BASE semantics; default [0, 0, 0]). */
129
129
  at?: Vec3;
130
130
  /** Center the cylinder (base at −h/2 / center at `at`) instead of base at `at`/origin. */
131
131
  centered?: boolean;
@@ -142,7 +142,7 @@ export interface ConeParams {
142
142
  radiusTop: number;
143
143
  /** Height along +Z (mm). */
144
144
  height: number;
145
- /** Base circle center (brepjs `at`, BASE semantics; default [0, 0, 0]). */
145
+ /** Base circle center (原 brepjs `at`, BASE semantics; default [0, 0, 0]). */
146
146
  at?: Vec3;
147
147
  /** Center the cone (base at −h/2 / center at `at`) instead of base at `at`/origin. */
148
148
  centered?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mesh/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mesh/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mesh/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA8DH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,WAAW,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,CAAA;AAC3E,CAAC;AAED,aAAa;AAEb,8DAA8D;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAA;AAC9B,4CAA4C;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAA;AACzB,4CAA4C;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAA;AAE3B;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,CAAqB;IAC7C,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,YAAY,CAAA;IACxC,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9D,CAAC","sourcesContent":["/**\n * mesh 类型定义 — 纯数据几何 API 的类型契约\n *\n * 设计原则(§5.1):\n * - 全部纯数据:输入输出是 ManifoldMeshData 或 JSON 值,不碰 THREE 场景、不读 store\n * - 不可变:每个 API 返回新几何,不修改输入\n * - 坐标系:右手系 +Z 向上、毫米、角度用度\n * - 坐标空间:所有 API 输入/输出均为**世界空间** ManifoldMeshData\n * (局部↔世界变换由执行器负责,mesh 不感知 mesh.matrixWorld)\n *\n * P1 阶段 Shape = ManifoldMeshData(无 worker)。\n * P3+ 阶段 Shape 将变为 worker 内 Manifold 对象的句柄。\n */\n\nimport type { PbrAppearance } from '../api/appearance'\nimport type { ShapeMeta } from '../api/meta'\n\n// ── 基础类型 ──\n\n/** 三维坐标 / RGB 颜色元组(分量 sRGB 0–1)。 */\nexport type Vec3 = [number, number, number]\n\n/**\n * A JSON-serializable value: scalar, null, array, or plain object.\n */\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [k: string]: JsonValue }\n\n// ── Shape ──\n\n/**\n * A mesh shape — the core data type of the mesh API.\n *\n * Shape is defined directly in mesh/types.ts rather than re-exported from\n * ops/types.ts; ops/types.ts imports it from here, removing the type cycle.\n *\n * 外观(PBR):`appearance` 为可选数据字段(设计文档 2026-10-05 v2 §4.2),\n * 双链路产物自解释、可序列化;外观设置是 Shape **方法**(非 op,见\n * `api/appearance.ts` 的 `ShapeAppearanceMethods` / `attachAppearanceMethods`),\n * 方法只挂载在产物构造点(solid/curve)返回的实例上,基础 Shape 保持纯数据\n * 契约——因此本接口**不** extends 方法接口,`isMeshShape` 鸭子判定不受影响。\n */\nexport interface Shape {\n positions: Float32Array\n indices: Uint32Array\n /** 可选:形状级外观(mesh/brep 双链路产物自解释;worker 序列化保留字段、不保留方法)。 */\n appearance?: PbrAppearance\n /** Phase 2:面级外观分组 [三角形起始, 数量, 外观];存在时优先于 appearance 作为未分组默认。 */\n materialGroups?: Array<{ start: number; count: number; appearance: PbrAppearance }>\n /** Phase 2:顶点颜色(3MF colorgroup / 面级 mesh 链),sRGB 0–1,长度 = positions 长度。 */\n vertexColors?: Float32Array\n /**\n * 零件级说明性元数据(设计文档 2026-10-05-meta §4.3):名称/描述/料号/自定义\n * 键值,随 Shape 走 mesh/brep 双链路、JSON 可序列化。设置方法是 Shape 实例\n * 方法(非 op,见 `api/meta.ts` 的 `ShapeMetaMethods` / `attachMetaMethods`),\n * 方法只挂载在产物构造点(solid/curve)返回的实例上,基础 Shape 保持纯数据\n * 契约——因此本接口**不** extends 方法接口,`isMeshShape` 鸭子判定不受影响。\n */\n meta?: ShapeMeta\n /**\n * 面结构元数据:面序号 → 三角形区间 [start, count)(start/count 为三角形索引,\n * 对应 positions/indices 焊接后的三角形序列)。仅参数化 primitives 构造时记录\n * (面结构构造时已知、三角形顺序固定);manifold 布尔/组合/导入后无 CAD 面\n * 概念,本字段不存在。`setFaceColor`/`setFaceMaterial` 依赖本字段把面序号映射\n * 到三角形区间并写入 materialGroups。\n */\n faceRanges?: Array<{ start: number; count: number }>\n}\n\n/**\n * Structural guard: returns true when the value looks like a mesh Shape\n * (duck-typed via positions/indices, with no requirements on third-party\n * types).\n *\n * Per the keep-syntax design, hosts use this guard to distinguish mesh Shapes\n * from compounds when consuming ExecutionResult.outputs, in the same style as\n * the runtime-internal isShapeLike.\n * @param v - the value to test.\n * @returns true when the value is a mesh Shape.\n */\nexport function isMeshShape(v: unknown): v is Shape {\n return !!v && typeof v === 'object' && 'positions' in v && 'indices' in v\n}\n\n// ── 创建参数 ──\n\n/** Default radial segment count used for rounded geometry. */\nexport const NRAD_DEFAULT = 64\n/** Minimum allowed radial segment count. */\nexport const NRAD_MIN = 3\n/** Maximum allowed radial segment count. */\nexport const NRAD_MAX = 128\n\n/**\n * Clamp an nRad value into the legal range [NRAD_MIN, NRAD_MAX], rounding to\n * the nearest integer; undefined falls back to NRAD_DEFAULT.\n * @param n - the requested radial segment count, or undefined.\n * @returns the clamped radial segment count.\n */\nexport function clampNRad(n: number | undefined): number {\n if (n === undefined) return NRAD_DEFAULT\n return Math.max(NRAD_MIN, Math.min(NRAD_MAX, Math.round(n)))\n}\n\n/**\n * Parameters for creating a box (brepjs `box(width, depth, height, {at?, centered?, segments?})`\n * contract, §4.1 A 决策). Default: min-corner at the origin. `centered: true` shifts so the\n * box is centered at the origin; `at` is CENTER semantics and takes precedence over `centered`.\n */\nexport interface BoxParams {\n /** Side length along X (mm). */\n width: number\n /** Side length along Y (mm). */\n depth: number\n /** Side length along Z (mm). */\n height: number\n /** Center position (brepjs `at`, CENTER semantics); takes precedence over `centered`. */\n at?: Vec3\n /** Center the box at the origin when `at` is absent. Default: false (min-corner at origin). */\n centered?: boolean\n /** Tessellation segment count (box: affects only brep/mesh tessellation, not topology). */\n segments?: number\n /** Internal historical alias for `segments` (accepted by clampNRad, §5.1). */\n nRad?: number\n}\n\n/** Parameters for creating a sphere. */\nexport interface SphereParams {\n radius: number\n segments?: number\n center?: Vec3\n nRad?: number\n}\n\n/** Parameters for creating a cylinder (brepjs contract, §4.3 A). */\nexport interface CylinderParams {\n /** Radius (mm). */\n radius: number\n /** Height along +Z (mm). */\n height: number\n /** Base circle center (brepjs `at`, BASE semantics; default [0, 0, 0]). */\n at?: Vec3\n /** Center the cylinder (base at −h/2 / center at `at`) instead of base at `at`/origin. */\n centered?: boolean\n /** Tessellation segment count (cylinder: affects only tessellation, not topology). */\n segments?: number\n /** Internal historical alias for `segments` (accepted by clampNRad, §5.1). */\n nRad?: number\n}\n\n/** Parameters for creating a cone (or a truncated cone). */\nexport interface ConeParams {\n /** Radius at the base (mm). */\n radiusBottom: number\n /** Radius at the top (mm); 0 for a pointed cone, === radiusBottom for a cylinder. */\n radiusTop: number\n /** Height along +Z (mm). */\n height: number\n /** Base circle center (brepjs `at`, BASE semantics; default [0, 0, 0]). */\n at?: Vec3\n /** Center the cone (base at −h/2 / center at `at`) instead of base at `at`/origin. */\n centered?: boolean\n /** Tessellation segment count (cone: affects only mere tessellation, not topology). */\n segments?: number\n /** Internal historical alias for `segments` (accepted by clampNRad, §5.1). */\n nRad?: number\n}\n\n/**\n * Parameters for creating a wedge (trapezoidal prism).\n */\nexport interface WedgeParams {\n /** Width of the base edge (mm), along the Y axis. */\n width: number\n /** Height of the trapezoid (mm), along the Z axis. */\n height: number\n /** Angle between the base edge and the slope (degrees). */\n angle: number\n /** Total extrusion length (mm), along the X axis. */\n length: number\n center?: Vec3\n nRad?: number\n}\n\n/** Parameters for creating 3D text. */\nexport interface TextParams {\n text: string\n size: number\n depth: number\n}\n\n/** Parameters for extruding an SVG into a solid. */\nexport interface SvgExtrudeParams {\n svg: string\n depth: number\n targetLongSide: number\n naturalWidth?: number\n naturalHeight?: number\n}\n\n/** Parameters for building a solid from an SDF (signed distance function). */\nexport interface SdfParams {\n code: string\n box?: [Vec3, Vec3]\n resolution?: number\n params?: Record<string, number>\n}\n\n// ── 变换参数 ──\n\n/** Parameters for translating a shape. */\nexport interface TranslateParams {\n offset: Vec3\n}\n\n/** Parameters for rotating a shape. */\nexport interface RotateParams {\n angles: Vec3\n pivot?: Vec3\n}\n\n/** Parameters for scaling a shape. */\nexport interface ScaleParams {\n factor: number | Vec3\n}\n\n// ── 布尔参数 ──\n\n/** Kinds of binary boolean operations. */\nexport type BooleanOperation = 'union' | 'subtract' | 'intersect'\n\n// ── 分割参数 ──\n\n/** A cutting plane defined by a unit normal and a signed offset. */\nexport interface SplitPlane {\n normal: Vec3\n offset: number\n}\n\n/** Parameters for a dovetail split, including the cutting plane setup. */\nexport interface DovetailSplitParams {\n plane: SplitPlane\n planeCenter: Vec3\n widthDir: Vec3\n bboxWidthOnWidthDir: number\n groove: {\n depth: number\n depthTolerance: number\n width: number\n widthTolerance: number\n flapsAngle: number\n }\n}\n\n/** Parameters for a dowel-pin split, including the cutting plane setup. */\nexport interface DowelSplitParams {\n plane: SplitPlane\n planeCenter: Vec3\n widthDir: Vec3\n dowel: {\n diameter: number\n diameterTolerance: number\n height: number\n heightTolerance: number\n }\n selectedSections?: number[] | null\n}\n\n/** Parameters for a straight-tenon split, including the cutting plane setup. */\nexport interface TenonSplitParams {\n plane: SplitPlane\n planeCenter: Vec3\n widthDir: Vec3\n tenon: {\n sideLength: number\n sideLengthTolerance: number\n height: number\n heightTolerance: number\n }\n selectedSections?: number[] | null\n}\n\n/** Result of a joinery split: the two halves plus the cut-out wedge. */\nexport interface SplitResult {\n front: Shape\n back: Shape\n wedge: Shape | null\n}\n\n// ── 钻孔参数 ──\n\n/** Parameters for drilling a hole. */\nexport interface DrillParams {\n diameter: number\n depth?: number\n type: 'through' | 'blind'\n position: Vec3\n direction: Vec3\n faceNormal: Vec3\n tolerance?: number\n holeType?: 'simple' | 'screw'\n screwSystem?: string\n screwSpecIdx?: number\n screwThread?: string\n screwHead?: string\n}\n\n// ── 拉伸参数 ──\n\n/** Parameters for extruding a face bounded by a plane. */\nexport interface ExtrudeParams {\n normal: Vec3\n planeDistance: number\n length: number\n mode?: 'centered' | 'forward' | 'backward'\n}\n\n// ── 雕刻参数 ──\n\n/** Parameters for engraving text or an SVG onto a face. */\nexport interface EngraveParams {\n mode: 'convex' | 'concave'\n depth: number\n face: {\n center: Vec3\n normal: Vec3\n }\n text?: string\n textSize?: number\n svg?: string\n svgNaturalWidth?: number\n svgNaturalHeight?: number\n svgSize?: number\n}\n\n/** Parameters for applying a knurl texture to a face. */\nexport interface KnurlParams {\n face: {\n center: Vec3\n normal: Vec3\n }\n knurlTextureHeight: number\n knurlInvertDisplacement: boolean\n knurlRefineLength: number\n knurlScaleU: number\n knurlScaleV: number\n knurlMappingMode: number\n}\n\n// ── 查询结果 ──\n\n/** Axis-aligned bounding box in world space. */\nexport interface BoundingBox {\n min: Vec3\n max: Vec3\n}\n\n/** Description of a face on a shape: center, normal and area. */\nexport interface FaceDescriptor {\n center: Vec3\n normal: Vec3\n area: number\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mesh/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA8DH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,WAAW,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,CAAA;AAC3E,CAAC;AAED,aAAa;AAEb,8DAA8D;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAA;AAC9B,4CAA4C;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAA;AACzB,4CAA4C;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAA;AAE3B;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,CAAqB;IAC7C,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,YAAY,CAAA;IACxC,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9D,CAAC","sourcesContent":["/**\n * mesh 类型定义 — 纯数据几何 API 的类型契约\n *\n * 设计原则(§5.1):\n * - 全部纯数据:输入输出是 ManifoldMeshData 或 JSON 值,不碰 THREE 场景、不读 store\n * - 不可变:每个 API 返回新几何,不修改输入\n * - 坐标系:右手系 +Z 向上、毫米、角度用度\n * - 坐标空间:所有 API 输入/输出均为**世界空间** ManifoldMeshData\n * (局部↔世界变换由执行器负责,mesh 不感知 mesh.matrixWorld)\n *\n * P1 阶段 Shape = ManifoldMeshData(无 worker)。\n * P3+ 阶段 Shape 将变为 worker 内 Manifold 对象的句柄。\n */\n\nimport type { PbrAppearance } from '../api/appearance'\nimport type { ShapeMeta } from '../api/meta'\n\n// ── 基础类型 ──\n\n/** 三维坐标 / RGB 颜色元组(分量 sRGB 0–1)。 */\nexport type Vec3 = [number, number, number]\n\n/**\n * A JSON-serializable value: scalar, null, array, or plain object.\n */\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [k: string]: JsonValue }\n\n// ── Shape ──\n\n/**\n * A mesh shape — the core data type of the mesh API.\n *\n * Shape is defined directly in mesh/types.ts rather than re-exported from\n * ops/types.ts; ops/types.ts imports it from here, removing the type cycle.\n *\n * 外观(PBR):`appearance` 为可选数据字段(设计文档 2026-10-05 v2 §4.2),\n * 双链路产物自解释、可序列化;外观设置是 Shape **方法**(非 op,见\n * `api/appearance.ts` 的 `ShapeAppearanceMethods` / `attachAppearanceMethods`),\n * 方法只挂载在产物构造点(solid/curve)返回的实例上,基础 Shape 保持纯数据\n * 契约——因此本接口**不** extends 方法接口,`isMeshShape` 鸭子判定不受影响。\n */\nexport interface Shape {\n positions: Float32Array\n indices: Uint32Array\n /** 可选:形状级外观(mesh/brep 双链路产物自解释;worker 序列化保留字段、不保留方法)。 */\n appearance?: PbrAppearance\n /** Phase 2:面级外观分组 [三角形起始, 数量, 外观];存在时优先于 appearance 作为未分组默认。 */\n materialGroups?: Array<{ start: number; count: number; appearance: PbrAppearance }>\n /** Phase 2:顶点颜色(3MF colorgroup / 面级 mesh 链),sRGB 0–1,长度 = positions 长度。 */\n vertexColors?: Float32Array\n /**\n * 零件级说明性元数据(设计文档 2026-10-05-meta §4.3):名称/描述/料号/自定义\n * 键值,随 Shape 走 mesh/brep 双链路、JSON 可序列化。设置方法是 Shape 实例\n * 方法(非 op,见 `api/meta.ts` 的 `ShapeMetaMethods` / `attachMetaMethods`),\n * 方法只挂载在产物构造点(solid/curve)返回的实例上,基础 Shape 保持纯数据\n * 契约——因此本接口**不** extends 方法接口,`isMeshShape` 鸭子判定不受影响。\n */\n meta?: ShapeMeta\n /**\n * 面结构元数据:面序号 → 三角形区间 [start, count)(start/count 为三角形索引,\n * 对应 positions/indices 焊接后的三角形序列)。仅参数化 primitives 构造时记录\n * (面结构构造时已知、三角形顺序固定);manifold 布尔/组合/导入后无 CAD 面\n * 概念,本字段不存在。`setFaceColor`/`setFaceMaterial` 依赖本字段把面序号映射\n * 到三角形区间并写入 materialGroups。\n */\n faceRanges?: Array<{ start: number; count: number }>\n}\n\n/**\n * Structural guard: returns true when the value looks like a mesh Shape\n * (duck-typed via positions/indices, with no requirements on third-party\n * types).\n *\n * Per the keep-syntax design, hosts use this guard to distinguish mesh Shapes\n * from compounds when consuming ExecutionResult.outputs, in the same style as\n * the runtime-internal isShapeLike.\n * @param v - the value to test.\n * @returns true when the value is a mesh Shape.\n */\nexport function isMeshShape(v: unknown): v is Shape {\n return !!v && typeof v === 'object' && 'positions' in v && 'indices' in v\n}\n\n// ── 创建参数 ──\n\n/** Default radial segment count used for rounded geometry. */\nexport const NRAD_DEFAULT = 64\n/** Minimum allowed radial segment count. */\nexport const NRAD_MIN = 3\n/** Maximum allowed radial segment count. */\nexport const NRAD_MAX = 128\n\n/**\n * Clamp an nRad value into the legal range [NRAD_MIN, NRAD_MAX], rounding to\n * the nearest integer; undefined falls back to NRAD_DEFAULT.\n * @param n - the requested radial segment count, or undefined.\n * @returns the clamped radial segment count.\n */\nexport function clampNRad(n: number | undefined): number {\n if (n === undefined) return NRAD_DEFAULT\n return Math.max(NRAD_MIN, Math.min(NRAD_MAX, Math.round(n)))\n}\n\n/**\n * Parameters for creating a box (原 brepjs `box(width, depth, height, {at?, centered?, segments?})`\n * contract, §4.1 A 决策). Default: min-corner at the origin. `centered: true` shifts so the\n * box is centered at the origin; `at` is CENTER semantics and takes precedence over `centered`.\n */\nexport interface BoxParams {\n /** Side length along X (mm). */\n width: number\n /** Side length along Y (mm). */\n depth: number\n /** Side length along Z (mm). */\n height: number\n /** Center position (原 brepjs `at`, CENTER semantics); takes precedence over `centered`. */\n at?: Vec3\n /** Center the box at the origin when `at` is absent. Default: false (min-corner at origin). */\n centered?: boolean\n /** Tessellation segment count (box: affects only brep/mesh tessellation, not topology). */\n segments?: number\n /** Internal historical alias for `segments` (accepted by clampNRad, §5.1). */\n nRad?: number\n}\n\n/** Parameters for creating a sphere. */\nexport interface SphereParams {\n radius: number\n segments?: number\n center?: Vec3\n nRad?: number\n}\n\n/** Parameters for creating a cylinder (原 brepjs contract, §4.3 A). */\nexport interface CylinderParams {\n /** Radius (mm). */\n radius: number\n /** Height along +Z (mm). */\n height: number\n /** Base circle center (原 brepjs `at`, BASE semantics; default [0, 0, 0]). */\n at?: Vec3\n /** Center the cylinder (base at −h/2 / center at `at`) instead of base at `at`/origin. */\n centered?: boolean\n /** Tessellation segment count (cylinder: affects only tessellation, not topology). */\n segments?: number\n /** Internal historical alias for `segments` (accepted by clampNRad, §5.1). */\n nRad?: number\n}\n\n/** Parameters for creating a cone (or a truncated cone). */\nexport interface ConeParams {\n /** Radius at the base (mm). */\n radiusBottom: number\n /** Radius at the top (mm); 0 for a pointed cone, === radiusBottom for a cylinder. */\n radiusTop: number\n /** Height along +Z (mm). */\n height: number\n /** Base circle center (原 brepjs `at`, BASE semantics; default [0, 0, 0]). */\n at?: Vec3\n /** Center the cone (base at −h/2 / center at `at`) instead of base at `at`/origin. */\n centered?: boolean\n /** Tessellation segment count (cone: affects only mere tessellation, not topology). */\n segments?: number\n /** Internal historical alias for `segments` (accepted by clampNRad, §5.1). */\n nRad?: number\n}\n\n/**\n * Parameters for creating a wedge (trapezoidal prism).\n */\nexport interface WedgeParams {\n /** Width of the base edge (mm), along the Y axis. */\n width: number\n /** Height of the trapezoid (mm), along the Z axis. */\n height: number\n /** Angle between the base edge and the slope (degrees). */\n angle: number\n /** Total extrusion length (mm), along the X axis. */\n length: number\n center?: Vec3\n nRad?: number\n}\n\n/** Parameters for creating 3D text. */\nexport interface TextParams {\n text: string\n size: number\n depth: number\n}\n\n/** Parameters for extruding an SVG into a solid. */\nexport interface SvgExtrudeParams {\n svg: string\n depth: number\n targetLongSide: number\n naturalWidth?: number\n naturalHeight?: number\n}\n\n/** Parameters for building a solid from an SDF (signed distance function). */\nexport interface SdfParams {\n code: string\n box?: [Vec3, Vec3]\n resolution?: number\n params?: Record<string, number>\n}\n\n// ── 变换参数 ──\n\n/** Parameters for translating a shape. */\nexport interface TranslateParams {\n offset: Vec3\n}\n\n/** Parameters for rotating a shape. */\nexport interface RotateParams {\n angles: Vec3\n pivot?: Vec3\n}\n\n/** Parameters for scaling a shape. */\nexport interface ScaleParams {\n factor: number | Vec3\n}\n\n// ── 布尔参数 ──\n\n/** Kinds of binary boolean operations. */\nexport type BooleanOperation = 'union' | 'subtract' | 'intersect'\n\n// ── 分割参数 ──\n\n/** A cutting plane defined by a unit normal and a signed offset. */\nexport interface SplitPlane {\n normal: Vec3\n offset: number\n}\n\n/** Parameters for a dovetail split, including the cutting plane setup. */\nexport interface DovetailSplitParams {\n plane: SplitPlane\n planeCenter: Vec3\n widthDir: Vec3\n bboxWidthOnWidthDir: number\n groove: {\n depth: number\n depthTolerance: number\n width: number\n widthTolerance: number\n flapsAngle: number\n }\n}\n\n/** Parameters for a dowel-pin split, including the cutting plane setup. */\nexport interface DowelSplitParams {\n plane: SplitPlane\n planeCenter: Vec3\n widthDir: Vec3\n dowel: {\n diameter: number\n diameterTolerance: number\n height: number\n heightTolerance: number\n }\n selectedSections?: number[] | null\n}\n\n/** Parameters for a straight-tenon split, including the cutting plane setup. */\nexport interface TenonSplitParams {\n plane: SplitPlane\n planeCenter: Vec3\n widthDir: Vec3\n tenon: {\n sideLength: number\n sideLengthTolerance: number\n height: number\n heightTolerance: number\n }\n selectedSections?: number[] | null\n}\n\n/** Result of a joinery split: the two halves plus the cut-out wedge. */\nexport interface SplitResult {\n front: Shape\n back: Shape\n wedge: Shape | null\n}\n\n// ── 钻孔参数 ──\n\n/** Parameters for drilling a hole. */\nexport interface DrillParams {\n diameter: number\n depth?: number\n type: 'through' | 'blind'\n position: Vec3\n direction: Vec3\n faceNormal: Vec3\n tolerance?: number\n holeType?: 'simple' | 'screw'\n screwSystem?: string\n screwSpecIdx?: number\n screwThread?: string\n screwHead?: string\n}\n\n// ── 拉伸参数 ──\n\n/** Parameters for extruding a face bounded by a plane. */\nexport interface ExtrudeParams {\n normal: Vec3\n planeDistance: number\n length: number\n mode?: 'centered' | 'forward' | 'backward'\n}\n\n// ── 雕刻参数 ──\n\n/** Parameters for engraving text or an SVG onto a face. */\nexport interface EngraveParams {\n mode: 'convex' | 'concave'\n depth: number\n face: {\n center: Vec3\n normal: Vec3\n }\n text?: string\n textSize?: number\n svg?: string\n svgNaturalWidth?: number\n svgNaturalHeight?: number\n svgSize?: number\n}\n\n/** Parameters for applying a knurl texture to a face. */\nexport interface KnurlParams {\n face: {\n center: Vec3\n normal: Vec3\n }\n knurlTextureHeight: number\n knurlInvertDisplacement: boolean\n knurlRefineLength: number\n knurlScaleU: number\n knurlScaleV: number\n knurlMappingMode: number\n}\n\n// ── 查询结果 ──\n\n/** Axis-aligned bounding box in world space. */\nexport interface BoundingBox {\n min: Vec3\n max: Vec3\n}\n\n/** Description of a face on a shape: center, normal and area. */\nexport interface FaceDescriptor {\n center: Vec3\n normal: Vec3\n area: number\n}\n"]}