@faicad/faijs 0.13.2 → 0.16.0

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 (485) hide show
  1. package/dist/api/api-namespace.d.ts +7 -0
  2. package/dist/api/api-namespace.d.ts.map +1 -1
  3. package/dist/api/api-namespace.js +44 -17
  4. package/dist/api/api-namespace.js.map +1 -1
  5. package/dist/api/boolean.d.ts +19 -0
  6. package/dist/api/boolean.d.ts.map +1 -1
  7. package/dist/api/boolean.js +71 -12
  8. package/dist/api/boolean.js.map +1 -1
  9. package/dist/api/chamfer.d.ts.map +1 -1
  10. package/dist/api/chamfer.js +12 -8
  11. package/dist/api/chamfer.js.map +1 -1
  12. package/dist/api/compound-geom.d.ts +45 -0
  13. package/dist/api/compound-geom.d.ts.map +1 -0
  14. package/dist/api/compound-geom.js +85 -0
  15. package/dist/api/compound-geom.js.map +1 -0
  16. package/dist/api/edge-ref.d.ts.map +1 -1
  17. package/dist/api/edge-ref.js +7 -4
  18. package/dist/api/edge-ref.js.map +1 -1
  19. package/dist/api/engrave.d.ts.map +1 -1
  20. package/dist/api/engrave.js +1 -0
  21. package/dist/api/engrave.js.map +1 -1
  22. package/dist/api/extrude.d.ts.map +1 -1
  23. package/dist/api/extrude.js +131 -3
  24. package/dist/api/extrude.js.map +1 -1
  25. package/dist/api/face-ref.d.ts.map +1 -1
  26. package/dist/api/face-ref.js +7 -4
  27. package/dist/api/face-ref.js.map +1 -1
  28. package/dist/api/fillet.d.ts.map +1 -1
  29. package/dist/api/fillet.js +6 -5
  30. package/dist/api/fillet.js.map +1 -1
  31. package/dist/api/generated/cad/script-face.d.ts +1 -1
  32. package/dist/api/generated/cad/script-face.d.ts.map +1 -1
  33. package/dist/api/generated/cad/script-face.js +1 -2
  34. package/dist/api/generated/cad/script-face.js.map +1 -1
  35. package/dist/api/generated/operations.js +16 -16
  36. package/dist/api/generated/operations.js.map +1 -1
  37. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  38. package/dist/api/generated/script-face-manifest.js +0 -2
  39. package/dist/api/generated/script-face-manifest.js.map +1 -1
  40. package/dist/api/generated/script-face.d.ts +1 -7
  41. package/dist/api/generated/script-face.d.ts.map +1 -1
  42. package/dist/api/generated/script-face.js +2 -4
  43. package/dist/api/generated/script-face.js.map +1 -1
  44. package/dist/api/generated/sketching.js +1 -1
  45. package/dist/api/generated/sketching.js.map +1 -1
  46. package/dist/api/generated/topology.d.ts +0 -56
  47. package/dist/api/generated/topology.d.ts.map +1 -1
  48. package/dist/api/generated/topology.js +19 -68
  49. package/dist/api/generated/topology.js.map +1 -1
  50. package/dist/api/import-brep.d.ts +36 -0
  51. package/dist/api/import-brep.d.ts.map +1 -0
  52. package/dist/api/import-brep.js +72 -0
  53. package/dist/api/import-brep.js.map +1 -0
  54. package/dist/api/import-step.d.ts +28 -0
  55. package/dist/api/import-step.d.ts.map +1 -0
  56. package/dist/api/import-step.js +57 -0
  57. package/dist/api/import-step.js.map +1 -0
  58. package/dist/api/index.d.ts +8 -12
  59. package/dist/api/index.d.ts.map +1 -1
  60. package/dist/api/index.js +22 -16
  61. package/dist/api/index.js.map +1 -1
  62. package/dist/api/internal/compat-op.d.ts.map +1 -1
  63. package/dist/api/internal/compat-op.js +2 -1
  64. package/dist/api/internal/compat-op.js.map +1 -1
  65. package/dist/api/internal/compat-projection.d.ts +3 -1
  66. package/dist/api/internal/compat-projection.d.ts.map +1 -1
  67. package/dist/api/internal/compat-projection.js +8 -5
  68. package/dist/api/internal/compat-projection.js.map +1 -1
  69. package/dist/api/internal/replica-role-table.d.ts +36 -0
  70. package/dist/api/internal/replica-role-table.d.ts.map +1 -0
  71. package/dist/api/internal/replica-role-table.js +73 -0
  72. package/dist/api/internal/replica-role-table.js.map +1 -0
  73. package/dist/api/internal/result-unwrap.d.ts +3 -1
  74. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  75. package/dist/api/internal/result-unwrap.js +2 -2
  76. package/dist/api/internal/result-unwrap.js.map +1 -1
  77. package/dist/api/knurl.d.ts.map +1 -1
  78. package/dist/api/knurl.js +1 -0
  79. package/dist/api/knurl.js.map +1 -1
  80. package/dist/api/occt-kernel-bridge.d.ts +105 -27
  81. package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
  82. package/dist/api/occt-kernel-bridge.js +255 -41
  83. package/dist/api/occt-kernel-bridge.js.map +1 -1
  84. package/dist/api/pattern.d.ts +32 -0
  85. package/dist/api/pattern.d.ts.map +1 -0
  86. package/dist/api/pattern.js +85 -0
  87. package/dist/api/pattern.js.map +1 -0
  88. package/dist/api/place.d.ts +35 -0
  89. package/dist/api/place.d.ts.map +1 -0
  90. package/dist/api/place.js +113 -0
  91. package/dist/api/place.js.map +1 -0
  92. package/dist/api/primitives.d.ts.map +1 -1
  93. package/dist/api/primitives.js +10 -3
  94. package/dist/api/primitives.js.map +1 -1
  95. package/dist/api/replicate.d.ts +145 -0
  96. package/dist/api/replicate.d.ts.map +1 -0
  97. package/dist/api/replicate.js +351 -0
  98. package/dist/api/replicate.js.map +1 -0
  99. package/dist/api/revolve.d.ts +36 -0
  100. package/dist/api/revolve.d.ts.map +1 -0
  101. package/dist/api/revolve.js +165 -0
  102. package/dist/api/revolve.js.map +1 -0
  103. package/dist/api/screw.d.ts.map +1 -1
  104. package/dist/api/screw.js +1 -0
  105. package/dist/api/screw.js.map +1 -1
  106. package/dist/api/sdf.d.ts.map +1 -1
  107. package/dist/api/sdf.js +1 -0
  108. package/dist/api/sdf.js.map +1 -1
  109. package/dist/api/sketch.d.ts.map +1 -1
  110. package/dist/api/sketch.js +1 -0
  111. package/dist/api/sketch.js.map +1 -1
  112. package/dist/api/split.d.ts +31 -0
  113. package/dist/api/split.d.ts.map +1 -0
  114. package/dist/api/split.js +96 -0
  115. package/dist/api/split.js.map +1 -0
  116. package/dist/api/surface/arg-spec.d.ts +17 -0
  117. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  118. package/dist/api/surface/arg-spec.js +86 -66
  119. package/dist/api/surface/arg-spec.js.map +1 -1
  120. package/dist/api/surface/projection-overrides.d.ts.map +1 -1
  121. package/dist/api/surface/projection-overrides.js +6 -0
  122. package/dist/api/surface/projection-overrides.js.map +1 -1
  123. package/dist/api/topo-resolve.d.ts.map +1 -1
  124. package/dist/api/topo-resolve.js +65 -3
  125. package/dist/api/topo-resolve.js.map +1 -1
  126. package/dist/api/transform.d.ts +4 -0
  127. package/dist/api/transform.d.ts.map +1 -1
  128. package/dist/api/transform.js +44 -12
  129. package/dist/api/transform.js.map +1 -1
  130. package/dist/boolean/deriveNormals.d.ts +5 -4
  131. package/dist/boolean/deriveNormals.d.ts.map +1 -1
  132. package/dist/boolean/deriveNormals.js +24 -7
  133. package/dist/boolean/deriveNormals.js.map +1 -1
  134. package/dist/brep/brep-ops.d.ts +34 -1
  135. package/dist/brep/brep-ops.d.ts.map +1 -1
  136. package/dist/brep/brep-ops.js +62 -22
  137. package/dist/brep/brep-ops.js.map +1 -1
  138. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  139. package/dist/brep/engine/adapters/brep-mock.js +66 -0
  140. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  141. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  142. package/dist/brep/engine/adapters/brepkit.js +44 -1
  143. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  144. package/dist/brep/engine/adapters/occt.d.ts +1 -5
  145. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  146. package/dist/brep/engine/adapters/occt.js +246 -9
  147. package/dist/brep/engine/adapters/occt.js.map +1 -1
  148. package/dist/brep/engine/primitives.d.ts +96 -0
  149. package/dist/brep/engine/primitives.d.ts.map +1 -1
  150. package/dist/brep/engine/primitives.js.map +1 -1
  151. package/dist/brep/engine/types.d.ts +66 -6
  152. package/dist/brep/engine/types.d.ts.map +1 -1
  153. package/dist/brep/engine/types.js.map +1 -1
  154. package/dist/brep/export/step.d.ts.map +1 -1
  155. package/dist/brep/export/step.js +6 -1
  156. package/dist/brep/export/step.js.map +1 -1
  157. package/dist/brep/face-evolution.d.ts +78 -8
  158. package/dist/brep/face-evolution.d.ts.map +1 -1
  159. package/dist/brep/face-evolution.js +130 -17
  160. package/dist/brep/face-evolution.js.map +1 -1
  161. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  162. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  163. package/dist/brepkit-kernel/brepkitKernel.js +108 -12
  164. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  165. package/dist/browser.d.ts +6 -28
  166. package/dist/browser.d.ts.map +1 -1
  167. package/dist/browser.js +6 -17
  168. package/dist/browser.js.map +1 -1
  169. package/dist/cad-runtime/admit-compat-lib.d.ts +13 -0
  170. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  171. package/dist/cad-runtime/admit-compat-lib.js +27 -0
  172. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  173. package/dist/cad-runtime/backend-dispatch.d.ts +46 -3
  174. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  175. package/dist/cad-runtime/backend-dispatch.js +48 -3
  176. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  177. package/dist/cad-runtime/browser-lib-loader.d.ts +4 -4
  178. package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
  179. package/dist/cad-runtime/browser-lib-loader.js +7 -4
  180. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  181. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  182. package/dist/cad-runtime/direct-executor.js +14 -4
  183. package/dist/cad-runtime/direct-executor.js.map +1 -1
  184. package/dist/cad-runtime/module-registry.d.ts +3 -1
  185. package/dist/cad-runtime/module-registry.d.ts.map +1 -1
  186. package/dist/cad-runtime/module-registry.js +13 -1
  187. package/dist/cad-runtime/module-registry.js.map +1 -1
  188. package/dist/cad-runtime/runtime-concurrent-error.d.ts +38 -0
  189. package/dist/cad-runtime/runtime-concurrent-error.d.ts.map +1 -0
  190. package/dist/cad-runtime/runtime-concurrent-error.js +43 -0
  191. package/dist/cad-runtime/runtime-concurrent-error.js.map +1 -0
  192. package/dist/cad-runtime/runtime.d.ts +52 -2
  193. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  194. package/dist/cad-runtime/runtime.js +180 -9
  195. package/dist/cad-runtime/runtime.js.map +1 -1
  196. package/dist/define-op.d.ts +22 -0
  197. package/dist/define-op.d.ts.map +1 -1
  198. package/dist/define-op.js +82 -12
  199. package/dist/define-op.js.map +1 -1
  200. package/dist/env-agnostic.d.ts +38 -0
  201. package/dist/env-agnostic.d.ts.map +1 -0
  202. package/dist/env-agnostic.js +29 -0
  203. package/dist/env-agnostic.js.map +1 -0
  204. package/dist/fcstd/attachment.d.ts +8 -1
  205. package/dist/fcstd/attachment.d.ts.map +1 -1
  206. package/dist/fcstd/attachment.js +7 -1
  207. package/dist/fcstd/attachment.js.map +1 -1
  208. package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
  209. package/dist/fcstd/build-fai-zip.js +12 -7
  210. package/dist/fcstd/build-fai-zip.js.map +1 -1
  211. package/dist/fcstd/codegen.d.ts +10 -1
  212. package/dist/fcstd/codegen.d.ts.map +1 -1
  213. package/dist/fcstd/codegen.js +158 -49
  214. package/dist/fcstd/codegen.js.map +1 -1
  215. package/dist/fcstd/contour.d.ts.map +1 -1
  216. package/dist/fcstd/contour.js +23 -24
  217. package/dist/fcstd/contour.js.map +1 -1
  218. package/dist/fcstd/convert.d.ts +2 -18
  219. package/dist/fcstd/convert.d.ts.map +1 -1
  220. package/dist/fcstd/convert.js +35 -53
  221. package/dist/fcstd/convert.js.map +1 -1
  222. package/dist/fcstd/expressions.d.ts +24 -0
  223. package/dist/fcstd/expressions.d.ts.map +1 -1
  224. package/dist/fcstd/expressions.js +91 -0
  225. package/dist/fcstd/expressions.js.map +1 -1
  226. package/dist/fcstd/external-geo.d.ts +12 -1
  227. package/dist/fcstd/external-geo.d.ts.map +1 -1
  228. package/dist/fcstd/external-geo.js +15 -1
  229. package/dist/fcstd/external-geo.js.map +1 -1
  230. package/dist/fcstd/feature-translate.d.ts +21 -1
  231. package/dist/fcstd/feature-translate.d.ts.map +1 -1
  232. package/dist/fcstd/feature-translate.js +124 -8
  233. package/dist/fcstd/feature-translate.js.map +1 -1
  234. package/dist/fcstd/structural-types.d.ts +83 -0
  235. package/dist/fcstd/structural-types.d.ts.map +1 -0
  236. package/dist/fcstd/structural-types.js +121 -0
  237. package/dist/fcstd/structural-types.js.map +1 -0
  238. package/dist/index.d.ts +7 -23
  239. package/dist/index.d.ts.map +1 -1
  240. package/dist/index.js +10 -16
  241. package/dist/index.js.map +1 -1
  242. package/dist/lang/determinism-scanner.d.ts +71 -0
  243. package/dist/lang/determinism-scanner.d.ts.map +1 -0
  244. package/dist/lang/determinism-scanner.js +625 -0
  245. package/dist/lang/determinism-scanner.js.map +1 -0
  246. package/dist/lang/symbol-table.d.ts +31 -0
  247. package/dist/lang/symbol-table.d.ts.map +1 -1
  248. package/dist/lang/symbol-table.generated.d.ts +13 -19
  249. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  250. package/dist/lang/symbol-table.generated.js +13 -19
  251. package/dist/lang/symbol-table.generated.js.map +1 -1
  252. package/dist/lang/symbol-table.js +50 -1
  253. package/dist/lang/symbol-table.js.map +1 -1
  254. package/dist/mesh/creased-normals.d.ts +50 -0
  255. package/dist/mesh/creased-normals.d.ts.map +1 -0
  256. package/dist/mesh/creased-normals.js +114 -0
  257. package/dist/mesh/creased-normals.js.map +1 -0
  258. package/dist/mesh/decoration-provider.d.ts +53 -0
  259. package/dist/mesh/decoration-provider.d.ts.map +1 -0
  260. package/dist/mesh/decoration-provider.js +21 -0
  261. package/dist/mesh/decoration-provider.js.map +1 -0
  262. package/dist/mesh/engrave.d.ts +4 -0
  263. package/dist/mesh/engrave.d.ts.map +1 -1
  264. package/dist/mesh/engrave.js +22 -31
  265. package/dist/mesh/engrave.js.map +1 -1
  266. package/dist/mesh/index.d.ts +5 -14
  267. package/dist/mesh/index.d.ts.map +1 -1
  268. package/dist/mesh/index.js +7 -18
  269. package/dist/mesh/index.js.map +1 -1
  270. package/dist/mesh/io.d.ts +2 -1
  271. package/dist/mesh/io.d.ts.map +1 -1
  272. package/dist/mesh/io.js +5 -7
  273. package/dist/mesh/io.js.map +1 -1
  274. package/dist/mesh/primitives.d.ts +5 -18
  275. package/dist/mesh/primitives.d.ts.map +1 -1
  276. package/dist/mesh/primitives.js +4 -48
  277. package/dist/mesh/primitives.js.map +1 -1
  278. package/dist/mesh/stl-loader.d.ts +23 -0
  279. package/dist/mesh/stl-loader.d.ts.map +1 -0
  280. package/dist/mesh/stl-loader.js +139 -0
  281. package/dist/mesh/stl-loader.js.map +1 -0
  282. package/dist/module-resolver/parse-imports.d.ts +37 -0
  283. package/dist/module-resolver/parse-imports.d.ts.map +1 -0
  284. package/dist/module-resolver/parse-imports.js +39 -0
  285. package/dist/module-resolver/parse-imports.js.map +1 -0
  286. package/dist/module-resolver/resolver.d.ts +1 -1
  287. package/dist/module-resolver/resolver.js +2 -2
  288. package/dist/module-resolver/resolver.js.map +1 -1
  289. package/dist/node-host/cli.d.ts.map +1 -1
  290. package/dist/node-host/cli.js +37 -4
  291. package/dist/node-host/cli.js.map +1 -1
  292. package/dist/primitives/text/cjk-font.d.ts +42 -0
  293. package/dist/primitives/text/cjk-font.d.ts.map +1 -0
  294. package/dist/primitives/text/cjk-font.js +86 -0
  295. package/dist/primitives/text/cjk-font.js.map +1 -0
  296. package/dist/runtime-state.d.ts +18 -6
  297. package/dist/runtime-state.d.ts.map +1 -1
  298. package/dist/runtime-state.js +9 -1
  299. package/dist/runtime-state.js.map +1 -1
  300. package/dist/sdk.d.ts +2 -2
  301. package/dist/sdk.js +2 -2
  302. package/dist/sdk.js.map +1 -1
  303. package/dist/shape.d.ts +15 -0
  304. package/dist/shape.d.ts.map +1 -1
  305. package/dist/shape.js +26 -3
  306. package/dist/shape.js.map +1 -1
  307. package/dist/symbol-table.d.ts +15 -0
  308. package/dist/symbol-table.d.ts.map +1 -0
  309. package/dist/symbol-table.js +14 -0
  310. package/dist/symbol-table.js.map +1 -0
  311. package/dist/topology/naming/build-naming.d.ts +14 -30
  312. package/dist/topology/naming/build-naming.d.ts.map +1 -1
  313. package/dist/topology/naming/build-naming.js +21 -54
  314. package/dist/topology/naming/build-naming.js.map +1 -1
  315. package/dist/topology/naming/capture-topo-ref.d.ts.map +1 -1
  316. package/dist/topology/naming/capture-topo-ref.js +5 -0
  317. package/dist/topology/naming/capture-topo-ref.js.map +1 -1
  318. package/dist/topology/naming/index.d.ts +3 -0
  319. package/dist/topology/naming/index.d.ts.map +1 -1
  320. package/dist/topology/naming/index.js +3 -0
  321. package/dist/topology/naming/index.js.map +1 -1
  322. package/dist/topology/naming/lineage-resolve.d.ts +80 -0
  323. package/dist/topology/naming/lineage-resolve.d.ts.map +1 -0
  324. package/dist/topology/naming/lineage-resolve.js +120 -0
  325. package/dist/topology/naming/lineage-resolve.js.map +1 -0
  326. package/dist/topology/naming/lineage.d.ts +349 -0
  327. package/dist/topology/naming/lineage.d.ts.map +1 -0
  328. package/dist/topology/naming/lineage.js +398 -0
  329. package/dist/topology/naming/lineage.js.map +1 -0
  330. package/dist/topology/naming/migrate.d.ts +41 -0
  331. package/dist/topology/naming/migrate.d.ts.map +1 -0
  332. package/dist/topology/naming/migrate.js +88 -0
  333. package/dist/topology/naming/migrate.js.map +1 -0
  334. package/dist/topology/naming/role-name.d.ts +176 -0
  335. package/dist/topology/naming/role-name.d.ts.map +1 -0
  336. package/dist/topology/naming/role-name.js +344 -0
  337. package/dist/topology/naming/role-name.js.map +1 -0
  338. package/dist/topology/naming/roles.d.ts +20 -22
  339. package/dist/topology/naming/roles.d.ts.map +1 -1
  340. package/dist/topology/naming/roles.js +51 -49
  341. package/dist/topology/naming/roles.js.map +1 -1
  342. package/dist/topology/naming/types.d.ts +65 -18
  343. package/dist/topology/naming/types.d.ts.map +1 -1
  344. package/dist/topology/naming/types.js.map +1 -1
  345. package/dist/vendored/brepjs/kernel/index.d.ts +5 -0
  346. package/dist/vendored/brepjs/kernel/index.d.ts.map +1 -1
  347. package/dist/vendored/brepjs/kernel/index.js +11 -0
  348. package/dist/vendored/brepjs/kernel/index.js.map +1 -1
  349. package/dist/weapp.d.ts +4 -4
  350. package/dist/weapp.d.ts.map +1 -1
  351. package/dist/weapp.js +7 -4
  352. package/dist/weapp.js.map +1 -1
  353. package/package.json +16 -14
  354. package/dist/api/compat/index.d.ts +0 -173
  355. package/dist/api/compat/index.d.ts.map +0 -1
  356. package/dist/api/compat/index.js +0 -222
  357. package/dist/api/compat/index.js.map +0 -1
  358. package/dist/api/compound.d.ts +0 -108
  359. package/dist/api/compound.d.ts.map +0 -1
  360. package/dist/api/compound.js +0 -162
  361. package/dist/api/compound.js.map +0 -1
  362. package/dist/api/copy.d.ts +0 -39
  363. package/dist/api/copy.d.ts.map +0 -1
  364. package/dist/api/copy.js +0 -81
  365. package/dist/api/copy.js.map +0 -1
  366. package/dist/api/fai_drill.d.ts +0 -46
  367. package/dist/api/fai_drill.d.ts.map +0 -1
  368. package/dist/api/fai_drill.js +0 -230
  369. package/dist/api/fai_drill.js.map +0 -1
  370. package/dist/api/fai_extrude.d.ts +0 -36
  371. package/dist/api/fai_extrude.d.ts.map +0 -1
  372. package/dist/api/fai_extrude.js +0 -78
  373. package/dist/api/fai_extrude.js.map +0 -1
  374. package/dist/api/fai_split.d.ts +0 -46
  375. package/dist/api/fai_split.d.ts.map +0 -1
  376. package/dist/api/fai_split.js +0 -253
  377. package/dist/api/fai_split.js.map +0 -1
  378. package/dist/api/load.d.ts +0 -39
  379. package/dist/api/load.d.ts.map +0 -1
  380. package/dist/api/load.js +0 -82
  381. package/dist/api/load.js.map +0 -1
  382. package/dist/api/svgExtrude.d.ts +0 -32
  383. package/dist/api/svgExtrude.d.ts.map +0 -1
  384. package/dist/api/svgExtrude.js +0 -73
  385. package/dist/api/svgExtrude.js.map +0 -1
  386. package/dist/api/text.d.ts +0 -34
  387. package/dist/api/text.d.ts.map +0 -1
  388. package/dist/api/text.js +0 -100
  389. package/dist/api/text.js.map +0 -1
  390. package/dist/brep/text/fontTestHelper.d.ts +0 -30
  391. package/dist/brep/text/fontTestHelper.d.ts.map +0 -1
  392. package/dist/brep/text/fontTestHelper.js +0 -57
  393. package/dist/brep/text/fontTestHelper.js.map +0 -1
  394. package/dist/cad-runtime/module-executor.d.ts +0 -271
  395. package/dist/cad-runtime/module-executor.d.ts.map +0 -1
  396. package/dist/cad-runtime/module-executor.js +0 -630
  397. package/dist/cad-runtime/module-executor.js.map +0 -1
  398. package/dist/cad-runtime/terminal-dag.d.ts +0 -65
  399. package/dist/cad-runtime/terminal-dag.d.ts.map +0 -1
  400. package/dist/cad-runtime/terminal-dag.js +0 -167
  401. package/dist/cad-runtime/terminal-dag.js.map +0 -1
  402. package/dist/faqts/browser.d.ts +0 -16
  403. package/dist/faqts/browser.d.ts.map +0 -1
  404. package/dist/faqts/browser.js +0 -13
  405. package/dist/faqts/browser.js.map +0 -1
  406. package/dist/faqts/exec-blob.d.ts +0 -14
  407. package/dist/faqts/exec-blob.d.ts.map +0 -1
  408. package/dist/faqts/exec-blob.js +0 -22
  409. package/dist/faqts/exec-blob.js.map +0 -1
  410. package/dist/faqts/exec-node.d.ts +0 -15
  411. package/dist/faqts/exec-node.d.ts.map +0 -1
  412. package/dist/faqts/exec-node.js +0 -29
  413. package/dist/faqts/exec-node.js.map +0 -1
  414. package/dist/faqts/imports.d.ts +0 -74
  415. package/dist/faqts/imports.d.ts.map +0 -1
  416. package/dist/faqts/imports.js +0 -95
  417. package/dist/faqts/imports.js.map +0 -1
  418. package/dist/faqts/index.d.ts +0 -22
  419. package/dist/faqts/index.d.ts.map +0 -1
  420. package/dist/faqts/index.js +0 -21
  421. package/dist/faqts/index.js.map +0 -1
  422. package/dist/faqts/node.d.ts +0 -23
  423. package/dist/faqts/node.d.ts.map +0 -1
  424. package/dist/faqts/node.js +0 -23
  425. package/dist/faqts/node.js.map +0 -1
  426. package/dist/faqts/run.d.ts +0 -62
  427. package/dist/faqts/run.d.ts.map +0 -1
  428. package/dist/faqts/run.js +0 -62
  429. package/dist/faqts/run.js.map +0 -1
  430. package/dist/faqts/transform.d.ts +0 -43
  431. package/dist/faqts/transform.d.ts.map +0 -1
  432. package/dist/faqts/transform.js +0 -35
  433. package/dist/faqts/transform.js.map +0 -1
  434. package/dist/lang/compile.d.ts +0 -50
  435. package/dist/lang/compile.d.ts.map +0 -1
  436. package/dist/lang/compile.js +0 -368
  437. package/dist/lang/compile.js.map +0 -1
  438. package/dist/lang/keep.d.ts +0 -109
  439. package/dist/lang/keep.d.ts.map +0 -1
  440. package/dist/lang/keep.js +0 -226
  441. package/dist/lang/keep.js.map +0 -1
  442. package/dist/lang/parser.d.ts +0 -91
  443. package/dist/lang/parser.d.ts.map +0 -1
  444. package/dist/lang/parser.js +0 -1594
  445. package/dist/lang/parser.js.map +0 -1
  446. package/dist/mesh/drill-hole/DrillHoleCore.d.ts +0 -90
  447. package/dist/mesh/drill-hole/DrillHoleCore.d.ts.map +0 -1
  448. package/dist/mesh/drill-hole/DrillHoleCore.js +0 -287
  449. package/dist/mesh/drill-hole/DrillHoleCore.js.map +0 -1
  450. package/dist/mesh/drill-hole/drill-types.d.ts +0 -34
  451. package/dist/mesh/drill-hole/drill-types.d.ts.map +0 -1
  452. package/dist/mesh/drill-hole/drill-types.js +0 -7
  453. package/dist/mesh/drill-hole/drill-types.js.map +0 -1
  454. package/dist/mesh/fai_drill.d.ts +0 -21
  455. package/dist/mesh/fai_drill.d.ts.map +0 -1
  456. package/dist/mesh/fai_drill.js +0 -92
  457. package/dist/mesh/fai_drill.js.map +0 -1
  458. package/dist/mesh/fai_extrude.d.ts +0 -24
  459. package/dist/mesh/fai_extrude.d.ts.map +0 -1
  460. package/dist/mesh/fai_extrude.js +0 -42
  461. package/dist/mesh/fai_extrude.js.map +0 -1
  462. package/dist/mesh/fai_split.d.ts +0 -164
  463. package/dist/mesh/fai_split.d.ts.map +0 -1
  464. package/dist/mesh/fai_split.js +0 -269
  465. package/dist/mesh/fai_split.js.map +0 -1
  466. package/dist/primitives/svg-extrude.d.ts +0 -43
  467. package/dist/primitives/svg-extrude.d.ts.map +0 -1
  468. package/dist/primitives/svg-extrude.js +0 -78
  469. package/dist/primitives/svg-extrude.js.map +0 -1
  470. package/dist/primitives/text/cjk.d.ts +0 -61
  471. package/dist/primitives/text/cjk.d.ts.map +0 -1
  472. package/dist/primitives/text/cjk.js +0 -215
  473. package/dist/primitives/text/cjk.js.map +0 -1
  474. package/dist/primitives/text-geometry.d.ts +0 -47
  475. package/dist/primitives/text-geometry.d.ts.map +0 -1
  476. package/dist/primitives/text-geometry.js +0 -127
  477. package/dist/primitives/text-geometry.js.map +0 -1
  478. package/dist/test-helpers.d.ts +0 -31
  479. package/dist/test-helpers.d.ts.map +0 -1
  480. package/dist/test-helpers.js +0 -55
  481. package/dist/test-helpers.js.map +0 -1
  482. package/dist/vendored/brepjs/core/kernelReentrancy.d.ts +0 -41
  483. package/dist/vendored/brepjs/core/kernelReentrancy.d.ts.map +0 -1
  484. package/dist/vendored/brepjs/core/kernelReentrancy.js +0 -68
  485. package/dist/vendored/brepjs/core/kernelReentrancy.js.map +0 -1
@@ -0,0 +1,53 @@
1
+ /**
2
+ * decoration-provider — host-injectable text/SVG decoration geometry.
3
+ *
4
+ * The `cad.engrave` op is a platform op (plan §4.2 C) but its decoration input
5
+ * is text or SVG, whose mesh geometry is produced by three's non-basic chain
6
+ * (`Shape` / `ExtrudeGeometry` / `SVGLoader`). That chain now lives in
7
+ * `@faicad/faijs-extra`, so core asks the host for the decoration geometry
8
+ * instead of importing it — the same capability-injection shape as
9
+ * `setFontLoader` / `setKnurlTextureLoader`.
10
+ *
11
+ * With no provider installed, `cad.engrave` still works on its BREP path
12
+ * (OCCT `textToSolid` / `svgToSolid`, zero three); only the **mesh** path needs
13
+ * a provider, and it reports a precise error instead of failing obscurely.
14
+ */
15
+ import type * as THREE from 'three';
16
+ /** Decoration inputs `cad.engrave` passes to the provider. */
17
+ export interface EngraveDecorationParams {
18
+ /** Text to engrave (mutually exclusive with `svg`). */
19
+ text?: string;
20
+ /** Text size in mm. */
21
+ textSize?: number;
22
+ /** SVG source text (mutually exclusive with `text`). */
23
+ svg?: string;
24
+ /** SVG long-side target size in mm. */
25
+ svgSize?: number;
26
+ /** SVG logical width, used for the scale factor. */
27
+ svgNaturalWidth?: number;
28
+ /** SVG logical height, used for the scale factor. */
29
+ svgNaturalHeight?: number;
30
+ /** Extrusion depth in mm. */
31
+ depth: number;
32
+ }
33
+ /**
34
+ * Produces the decoration geometry (local space, `+Z` = extrusion direction) for
35
+ * `cad.engrave`'s mesh path.
36
+ */
37
+ export type EngraveDecorationProvider = (params: EngraveDecorationParams) => Promise<THREE.BufferGeometry>;
38
+ /**
39
+ * Install (or clear, with `null`) the mesh-decoration provider.
40
+ * @param next - the provider, or null to uninstall.
41
+ */
42
+ export declare function setEngraveDecorationProvider(next: EngraveDecorationProvider | null): void;
43
+ /**
44
+ * Read the installed mesh-decoration provider.
45
+ *
46
+ * `cad.engrave`'s mesh path calls this; a null result means the host installed
47
+ * no provider and the op reports the precise "install a provider" error rather
48
+ * than failing obscurely.
49
+ *
50
+ * @returns the installed mesh-decoration provider, or null when none is set.
51
+ */
52
+ export declare function getEngraveDecorationProvider(): EngraveDecorationProvider | null;
53
+ //# sourceMappingURL=decoration-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoration-provider.d.ts","sourceRoot":"","sources":["../../src/mesh/decoration-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,8DAA8D;AAC9D,MAAM,WAAW,uBAAuB;IACtC,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG,CACtC,MAAM,EAAE,uBAAuB,KAC5B,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;AAIlC;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI,GAAG,IAAI,CAEzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,IAAI,yBAAyB,GAAG,IAAI,CAE/E"}
@@ -0,0 +1,21 @@
1
+ let provider = null;
2
+ /**
3
+ * Install (or clear, with `null`) the mesh-decoration provider.
4
+ * @param next - the provider, or null to uninstall.
5
+ */
6
+ export function setEngraveDecorationProvider(next) {
7
+ provider = next;
8
+ }
9
+ /**
10
+ * Read the installed mesh-decoration provider.
11
+ *
12
+ * `cad.engrave`'s mesh path calls this; a null result means the host installed
13
+ * no provider and the op reports the precise "install a provider" error rather
14
+ * than failing obscurely.
15
+ *
16
+ * @returns the installed mesh-decoration provider, or null when none is set.
17
+ */
18
+ export function getEngraveDecorationProvider() {
19
+ return provider;
20
+ }
21
+ //# sourceMappingURL=decoration-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoration-provider.js","sourceRoot":"","sources":["../../src/mesh/decoration-provider.ts"],"names":[],"mappings":"AA0CA,IAAI,QAAQ,GAAqC,IAAI,CAAA;AAErD;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAAsC;IACjF,QAAQ,GAAG,IAAI,CAAA;AACjB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,4BAA4B;IAC1C,OAAO,QAAQ,CAAA;AACjB,CAAC","sourcesContent":["/**\n * decoration-provider — host-injectable text/SVG decoration geometry.\n *\n * The `cad.engrave` op is a platform op (plan §4.2 C) but its decoration input\n * is text or SVG, whose mesh geometry is produced by three's non-basic chain\n * (`Shape` / `ExtrudeGeometry` / `SVGLoader`). That chain now lives in\n * `@faicad/faijs-extra`, so core asks the host for the decoration geometry\n * instead of importing it — the same capability-injection shape as\n * `setFontLoader` / `setKnurlTextureLoader`.\n *\n * With no provider installed, `cad.engrave` still works on its BREP path\n * (OCCT `textToSolid` / `svgToSolid`, zero three); only the **mesh** path needs\n * a provider, and it reports a precise error instead of failing obscurely.\n */\nimport type * as THREE from 'three'\n\n/** Decoration inputs `cad.engrave` passes to the provider. */\nexport interface EngraveDecorationParams {\n /** Text to engrave (mutually exclusive with `svg`). */\n text?: string\n /** Text size in mm. */\n textSize?: number\n /** SVG source text (mutually exclusive with `text`). */\n svg?: string\n /** SVG long-side target size in mm. */\n svgSize?: number\n /** SVG logical width, used for the scale factor. */\n svgNaturalWidth?: number\n /** SVG logical height, used for the scale factor. */\n svgNaturalHeight?: number\n /** Extrusion depth in mm. */\n depth: number\n}\n\n/**\n * Produces the decoration geometry (local space, `+Z` = extrusion direction) for\n * `cad.engrave`'s mesh path.\n */\nexport type EngraveDecorationProvider = (\n params: EngraveDecorationParams,\n) => Promise<THREE.BufferGeometry>\n\nlet provider: EngraveDecorationProvider | null = null\n\n/**\n * Install (or clear, with `null`) the mesh-decoration provider.\n * @param next - the provider, or null to uninstall.\n */\nexport function setEngraveDecorationProvider(next: EngraveDecorationProvider | null): void {\n provider = next\n}\n\n/**\n * Read the installed mesh-decoration provider.\n *\n * `cad.engrave`'s mesh path calls this; a null result means the host installed\n * no provider and the op reports the precise \"install a provider\" error rather\n * than failing obscurely.\n *\n * @returns the installed mesh-decoration provider, or null when none is set.\n */\nexport function getEngraveDecorationProvider(): EngraveDecorationProvider | null {\n return provider\n}\n"]}
@@ -17,6 +17,10 @@ import type { Shape, EngraveParams, KnurlParams } from './types.js';
17
17
  * position it onto a face, then run a boolean union (convex) or subtract
18
18
  * (concave).
19
19
  *
20
+ * The decoration geometry itself comes from the host-installed provider
21
+ * (`setEngraveDecorationProvider`) — three's `Shape`/`ExtrudeGeometry`/`SVGLoader`
22
+ * chain belongs to `@faicad/faijs-extra`, not to the platform surface.
23
+ *
20
24
  * @param shape - the world-space target shape.
21
25
  * @param params - engrave parameters (text/svg, depth, face, mode).
22
26
  * @returns the engraved shape in world space.
@@ -1 +1 @@
1
- {"version":3,"file":"engrave.d.ts","sourceRoot":"","sources":["../../src/mesh/engrave.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAEhE;;;;;;;;GAQG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CA0EjF;AAED;;;;;;;;;GASG;AACH,wBAAsB,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CA8E7E"}
1
+ {"version":3,"file":"engrave.d.ts","sourceRoot":"","sources":["../../src/mesh/engrave.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAEhE;;;;;;;;;;;;GAYG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAyDjF;AAED;;;;;;;;;GASG;AACH,wBAAsB,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CA8E7E"}
@@ -13,50 +13,41 @@
13
13
  */
14
14
  import * as THREE from 'three';
15
15
  import { computeBoolean, geoToManifoldMesh, manifoldMeshToGeo } from '../boolean/csg-backend.js';
16
- import { svgToExtrudedGeometry } from '../primitives/svg-extrude.js';
16
+ import { getEngraveDecorationProvider } from './decoration-provider.js';
17
17
  /**
18
18
  * Execute an engraving: generate the decoration geometry (text or SVG),
19
19
  * position it onto a face, then run a boolean union (convex) or subtract
20
20
  * (concave).
21
21
  *
22
+ * The decoration geometry itself comes from the host-installed provider
23
+ * (`setEngraveDecorationProvider`) — three's `Shape`/`ExtrudeGeometry`/`SVGLoader`
24
+ * chain belongs to `@faicad/faijs-extra`, not to the platform surface.
25
+ *
22
26
  * @param shape - the world-space target shape.
23
27
  * @param params - engrave parameters (text/svg, depth, face, mode).
24
28
  * @returns the engraved shape in world space.
25
29
  */
26
30
  export async function engrave(shape, params) {
27
31
  // 1. 生成装饰几何(局部空间,+Z = 挤出方向)
28
- let decorationGeo;
29
- if (params.text) {
30
- if (!params.text)
31
- throw new Error('Text is empty');
32
- const { getOpentypeFont, createTextGeometry } = await import('../primitives/text-geometry.js');
33
- const { containsCjk, loadSystemCjkFont, createMixedTextGeometry } = await import('../primitives/text/cjk.js');
34
- const font = await getOpentypeFont();
35
- if (containsCjk(params.text)) {
36
- const cjkFont = await loadSystemCjkFont();
37
- if (cjkFont) {
38
- decorationGeo = await createMixedTextGeometry(params.text, params.textSize ?? 10, params.depth, cjkFont.font, font);
39
- }
40
- else {
41
- decorationGeo = await createTextGeometry(params.text, params.textSize ?? 10, params.depth, font);
42
- }
43
- }
44
- else {
45
- decorationGeo = await createTextGeometry(params.text, params.textSize ?? 10, params.depth, font);
46
- }
47
- }
48
- else if (params.svg) {
49
- // logo / SVG
50
- decorationGeo = svgToExtrudedGeometry(params.svg, {
51
- depth: params.depth,
52
- targetLongSide: params.svgSize,
53
- naturalWidth: params.svgNaturalWidth ?? 0,
54
- naturalHeight: params.svgNaturalHeight ?? 0,
55
- });
56
- }
57
- else {
32
+ if (!params.text && !params.svg) {
58
33
  throw new Error('engrave requires either text or svg');
59
34
  }
35
+ const provider = getEngraveDecorationProvider();
36
+ if (!provider) {
37
+ throw new Error('engrave: no mesh decoration provider installed — the text/SVG geometry chain ' +
38
+ 'lives in @faicad/faijs-extra; call setEngraveDecorationProvider() (or ' +
39
+ 'installEditorMeshProviders() from @faicad/faijs-extra) before engraving in mesh mode, ' +
40
+ 'or run the op on the BREP path');
41
+ }
42
+ const decorationGeo = await provider({
43
+ text: params.text,
44
+ textSize: params.textSize,
45
+ svg: params.svg,
46
+ svgSize: params.svgSize,
47
+ svgNaturalWidth: params.svgNaturalWidth,
48
+ svgNaturalHeight: params.svgNaturalHeight,
49
+ depth: params.depth,
50
+ });
60
51
  // 2. 定位装饰几何到面
61
52
  const faceCenter = new THREE.Vector3(...params.face.center);
62
53
  const faceNormal = new THREE.Vector3(...params.face.normal);
@@ -1 +1 @@
1
- {"version":3,"file":"engrave.js","sourceRoot":"","sources":["../../src/mesh/engrave.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mesh 雕刻 API\n *\n * 提取来源:engine/components/engraving/EngravingCore.ts\n *\n * 从 executeEngraving 中提取纯几何计算部分:\n * 1. 生成装饰几何(文字或 SVG)\n * 2. 定位到面\n * 3. 布尔运算(凸=union,凹=subtract)\n *\n * 不包含:store 读写、commitGeometry、undo snapshot、toast。\n * 这些由执行器负责(P1 不改变现有执行器行为)。\n */\n\nimport * as THREE from 'three'\nimport { computeBoolean, geoToManifoldMesh, manifoldMeshToGeo } from '../boolean/csg-backend'\nimport { svgToExtrudedGeometry } from '../primitives/svg-extrude'\nimport type { Shape, EngraveParams, KnurlParams } from './types'\n\n/**\n * Execute an engraving: generate the decoration geometry (text or SVG),\n * position it onto a face, then run a boolean union (convex) or subtract\n * (concave).\n *\n * @param shape - the world-space target shape.\n * @param params - engrave parameters (text/svg, depth, face, mode).\n * @returns the engraved shape in world space.\n */\nexport async function engrave(shape: Shape, params: EngraveParams): Promise<Shape> {\n // 1. 生成装饰几何(局部空间,+Z = 挤出方向)\n let decorationGeo: THREE.BufferGeometry\n\n if (params.text) {\n if (!params.text) throw new Error('Text is empty')\n const { getOpentypeFont, createTextGeometry } = await import(\n '../primitives/text-geometry'\n )\n const { containsCjk, loadSystemCjkFont, createMixedTextGeometry } = await import(\n '../primitives/text/cjk'\n )\n const font = await getOpentypeFont()\n if (containsCjk(params.text)) {\n const cjkFont = await loadSystemCjkFont()\n if (cjkFont) {\n decorationGeo = await createMixedTextGeometry(\n params.text, params.textSize ?? 10, params.depth, cjkFont.font, font,\n )\n } else {\n decorationGeo = await createTextGeometry(\n params.text, params.textSize ?? 10, params.depth, font,\n )\n }\n } else {\n decorationGeo = await createTextGeometry(\n params.text, params.textSize ?? 10, params.depth, font,\n )\n }\n } else if (params.svg) {\n // logo / SVG\n decorationGeo = svgToExtrudedGeometry(params.svg, {\n depth: params.depth,\n targetLongSide: params.svgSize,\n naturalWidth: params.svgNaturalWidth ?? 0,\n naturalHeight: params.svgNaturalHeight ?? 0,\n })\n } else {\n throw new Error('engrave requires either text or svg')\n }\n\n // 2. 定位装饰几何到面\n const faceCenter = new THREE.Vector3(...params.face.center)\n const faceNormal = new THREE.Vector3(...params.face.normal)\n\n // Center geometry at origin\n decorationGeo.computeBoundingBox()\n const center = new THREE.Vector3()\n decorationGeo.boundingBox!.getCenter(center)\n decorationGeo.translate(-center.x, -center.y, -center.z)\n\n // Rotate +Z to align with face normal\n const quat = new THREE.Quaternion().setFromUnitVectors(\n new THREE.Vector3(0, 0, 1),\n faceNormal,\n )\n decorationGeo.applyQuaternion(quat)\n\n // Offset along normal (convex = outward, concave = inward)\n const offset = params.mode === 'convex' ? params.depth / 2 : -params.depth / 2\n const pos = faceCenter.clone().add(faceNormal.clone().multiplyScalar(offset))\n decorationGeo.translate(pos.x, pos.y, pos.z)\n\n // 3. 转换为 ManifoldMeshData\n const decorationData = geoToManifoldMesh(decorationGeo)\n\n // 4. 布尔运算\n const op = params.mode === 'convex' ? 'union' : 'subtract'\n const result = await computeBoolean([shape, decorationData], op)\n\n // 5. 清理\n decorationGeo.dispose()\n\n return result\n}\n\n/**\n * Apply a knurling texture displacement to a shape (vertex displacement, not a\n * boolean op). The replay path approximates UI face selection by excluding\n * faces whose normal deviates from the given face normal; the angle limits act\n * as an angular mask.\n *\n * @param shape - the world-space shape to knurl.\n * @param params - knurl parameters (texture height, refine length, UV scale, mapping mode).\n * @returns the displaced shape in world space.\n */\nexport async function knurl(shape: Shape, params: KnurlParams): Promise<Shape> {\n const { applyKnurlDisplacement, KNURL_DEFAULTS } = await import(\n './knurl/KnurlGenerator'\n )\n\n // 1. Shape → THREE.BufferGeometry\n const geo = manifoldMeshToGeo(shape, { computeNormals: true })\n\n // 2. 计算面排除权重:法向与 face.normal 不接近的面标记为排除\n const posAttr = geo.getAttribute('position')\n const triCount = posAttr.count / 3\n const faceNormal = new THREE.Vector3(...params.face.normal).normalize()\n\n // 计算每个三角形的法向\n const positions = posAttr.array as Float32Array\n const indices = geo.index ? (geo.index.array as Uint32Array) : null\n const faceWeights = new Float32Array(posAttr.count)\n\n const v0 = new THREE.Vector3()\n const v1 = new THREE.Vector3()\n const v2 = new THREE.Vector3()\n const edge1 = new THREE.Vector3()\n const edge2 = new THREE.Vector3()\n const triNormal = new THREE.Vector3()\n\n for (let t = 0; t < triCount; t++) {\n const i0 = indices ? indices[t * 3] : t * 3\n const i1 = indices ? indices[t * 3 + 1] : t * 3 + 1\n const i2 = indices ? indices[t * 3 + 2] : t * 3 + 2\n\n v0.set(positions[i0 * 3], positions[i0 * 3 + 1], positions[i0 * 3 + 2])\n v1.set(positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2])\n v2.set(positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2])\n\n edge1.subVectors(v1, v0)\n edge2.subVectors(v2, v0)\n triNormal.crossVectors(edge1, edge2).normalize()\n\n // 法向相似度:dot > 0.5 (~60° within) → 不排除\n const dot = triNormal.dot(faceNormal)\n if (dot < 0.5) {\n faceWeights[t * 3] = 1.0\n faceWeights[t * 3 + 1] = 1.0\n faceWeights[t * 3 + 2] = 1.0\n }\n }\n\n // 3. 计算包围盒\n geo.computeBoundingBox()\n const bb = geo.boundingBox!\n const partBounds = {\n min: bb.min.clone(),\n max: bb.max.clone(),\n size: new THREE.Vector3().subVectors(bb.max, bb.min),\n center: new THREE.Vector3().addVectors(bb.min, bb.max).multiplyScalar(0.5),\n }\n\n // 4. 调用 applyKnurlDisplacement\n const resultGeo = await applyKnurlDisplacement(\n geo,\n {\n ...KNURL_DEFAULTS,\n textureHeight: params.knurlTextureHeight,\n invertDisplacement: params.knurlInvertDisplacement,\n refineLength: params.knurlRefineLength,\n scaleU: params.knurlScaleU,\n scaleV: params.knurlScaleV,\n mappingMode: params.knurlMappingMode,\n faceWeights,\n },\n undefined,\n partBounds,\n )\n\n geo.dispose()\n\n // 5. THREE.BufferGeometry → Shape\n return geoToManifoldMesh(resultGeo)\n}\n"]}
1
+ {"version":3,"file":"engrave.js","sourceRoot":"","sources":["../../src/mesh/engrave.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mesh 雕刻 API\n *\n * 提取来源:engine/components/engraving/EngravingCore.ts\n *\n * 从 executeEngraving 中提取纯几何计算部分:\n * 1. 生成装饰几何(文字或 SVG)\n * 2. 定位到面\n * 3. 布尔运算(凸=union,凹=subtract)\n *\n * 不包含:store 读写、commitGeometry、undo snapshot、toast。\n * 这些由执行器负责(P1 不改变现有执行器行为)。\n */\n\nimport * as THREE from 'three'\nimport { computeBoolean, geoToManifoldMesh, manifoldMeshToGeo } from '../boolean/csg-backend'\nimport { getEngraveDecorationProvider } from './decoration-provider'\nimport type { Shape, EngraveParams, KnurlParams } from './types'\n\n/**\n * Execute an engraving: generate the decoration geometry (text or SVG),\n * position it onto a face, then run a boolean union (convex) or subtract\n * (concave).\n *\n * The decoration geometry itself comes from the host-installed provider\n * (`setEngraveDecorationProvider`) — three's `Shape`/`ExtrudeGeometry`/`SVGLoader`\n * chain belongs to `@faicad/faijs-extra`, not to the platform surface.\n *\n * @param shape - the world-space target shape.\n * @param params - engrave parameters (text/svg, depth, face, mode).\n * @returns the engraved shape in world space.\n */\nexport async function engrave(shape: Shape, params: EngraveParams): Promise<Shape> {\n // 1. 生成装饰几何(局部空间,+Z = 挤出方向)\n if (!params.text && !params.svg) {\n throw new Error('engrave requires either text or svg')\n }\n const provider = getEngraveDecorationProvider()\n if (!provider) {\n throw new Error(\n 'engrave: no mesh decoration provider installed — the text/SVG geometry chain ' +\n 'lives in @faicad/faijs-extra; call setEngraveDecorationProvider() (or ' +\n 'installEditorMeshProviders() from @faicad/faijs-extra) before engraving in mesh mode, ' +\n 'or run the op on the BREP path',\n )\n }\n const decorationGeo: THREE.BufferGeometry = await provider({\n text: params.text,\n textSize: params.textSize,\n svg: params.svg,\n svgSize: params.svgSize,\n svgNaturalWidth: params.svgNaturalWidth,\n svgNaturalHeight: params.svgNaturalHeight,\n depth: params.depth,\n })\n\n // 2. 定位装饰几何到面\n const faceCenter = new THREE.Vector3(...params.face.center)\n const faceNormal = new THREE.Vector3(...params.face.normal)\n\n // Center geometry at origin\n decorationGeo.computeBoundingBox()\n const center = new THREE.Vector3()\n decorationGeo.boundingBox!.getCenter(center)\n decorationGeo.translate(-center.x, -center.y, -center.z)\n\n // Rotate +Z to align with face normal\n const quat = new THREE.Quaternion().setFromUnitVectors(\n new THREE.Vector3(0, 0, 1),\n faceNormal,\n )\n decorationGeo.applyQuaternion(quat)\n\n // Offset along normal (convex = outward, concave = inward)\n const offset = params.mode === 'convex' ? params.depth / 2 : -params.depth / 2\n const pos = faceCenter.clone().add(faceNormal.clone().multiplyScalar(offset))\n decorationGeo.translate(pos.x, pos.y, pos.z)\n\n // 3. 转换为 ManifoldMeshData\n const decorationData = geoToManifoldMesh(decorationGeo)\n\n // 4. 布尔运算\n const op = params.mode === 'convex' ? 'union' : 'subtract'\n const result = await computeBoolean([shape, decorationData], op)\n\n // 5. 清理\n decorationGeo.dispose()\n\n return result\n}\n\n/**\n * Apply a knurling texture displacement to a shape (vertex displacement, not a\n * boolean op). The replay path approximates UI face selection by excluding\n * faces whose normal deviates from the given face normal; the angle limits act\n * as an angular mask.\n *\n * @param shape - the world-space shape to knurl.\n * @param params - knurl parameters (texture height, refine length, UV scale, mapping mode).\n * @returns the displaced shape in world space.\n */\nexport async function knurl(shape: Shape, params: KnurlParams): Promise<Shape> {\n const { applyKnurlDisplacement, KNURL_DEFAULTS } = await import(\n './knurl/KnurlGenerator'\n )\n\n // 1. Shape → THREE.BufferGeometry\n const geo = manifoldMeshToGeo(shape, { computeNormals: true })\n\n // 2. 计算面排除权重:法向与 face.normal 不接近的面标记为排除\n const posAttr = geo.getAttribute('position')\n const triCount = posAttr.count / 3\n const faceNormal = new THREE.Vector3(...params.face.normal).normalize()\n\n // 计算每个三角形的法向\n const positions = posAttr.array as Float32Array\n const indices = geo.index ? (geo.index.array as Uint32Array) : null\n const faceWeights = new Float32Array(posAttr.count)\n\n const v0 = new THREE.Vector3()\n const v1 = new THREE.Vector3()\n const v2 = new THREE.Vector3()\n const edge1 = new THREE.Vector3()\n const edge2 = new THREE.Vector3()\n const triNormal = new THREE.Vector3()\n\n for (let t = 0; t < triCount; t++) {\n const i0 = indices ? indices[t * 3] : t * 3\n const i1 = indices ? indices[t * 3 + 1] : t * 3 + 1\n const i2 = indices ? indices[t * 3 + 2] : t * 3 + 2\n\n v0.set(positions[i0 * 3], positions[i0 * 3 + 1], positions[i0 * 3 + 2])\n v1.set(positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2])\n v2.set(positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2])\n\n edge1.subVectors(v1, v0)\n edge2.subVectors(v2, v0)\n triNormal.crossVectors(edge1, edge2).normalize()\n\n // 法向相似度:dot > 0.5 (~60° within) → 不排除\n const dot = triNormal.dot(faceNormal)\n if (dot < 0.5) {\n faceWeights[t * 3] = 1.0\n faceWeights[t * 3 + 1] = 1.0\n faceWeights[t * 3 + 2] = 1.0\n }\n }\n\n // 3. 计算包围盒\n geo.computeBoundingBox()\n const bb = geo.boundingBox!\n const partBounds = {\n min: bb.min.clone(),\n max: bb.max.clone(),\n size: new THREE.Vector3().subVectors(bb.max, bb.min),\n center: new THREE.Vector3().addVectors(bb.min, bb.max).multiplyScalar(0.5),\n }\n\n // 4. 调用 applyKnurlDisplacement\n const resultGeo = await applyKnurlDisplacement(\n geo,\n {\n ...KNURL_DEFAULTS,\n textureHeight: params.knurlTextureHeight,\n invertDisplacement: params.knurlInvertDisplacement,\n refineLength: params.knurlRefineLength,\n scaleU: params.knurlScaleU,\n scaleV: params.knurlScaleV,\n mappingMode: params.knurlMappingMode,\n faceWeights,\n },\n undefined,\n partBounds,\n )\n\n geo.dispose()\n\n // 5. THREE.BufferGeometry → Shape\n return geoToManifoldMesh(resultGeo)\n}\n"]}
@@ -16,17 +16,17 @@ import * as primitives from './primitives.js';
16
16
  import * as brepPrimitives from '../brep/primitives-brep.js';
17
17
  import * as brepOps from '../brep/index.js';
18
18
  import * as booleanOps from './boolean.js';
19
- import * as splitOps from './fai_split.js';
20
- import * as drillOps from './fai_drill.js';
21
- import * as extrudeOps from './fai_extrude.js';
22
19
  import * as engraveOps from './engrave.js';
23
20
  import * as transformOps from './transform.js';
24
21
  import * as queryOps from './query.js';
25
22
  import * as ioOps from './io.js';
26
23
  /**
27
24
  * Unified `cad` API object aggregating the pure-data mesh operations: mesh and
28
- * BREP primitives, transforms, booleans, splits, drill/extrude/engrave/knurl,
29
- * geometry queries, file IO, and BREP feature operations.
25
+ * BREP primitives, transforms, booleans, engrave/knurl, geometry queries, file
26
+ * IO, and BREP feature operations.
27
+ *
28
+ * D1(2026-09-23 扩展库拆分):`text` / `svgExtrude` / `fai_*` 键已随
29
+ * `@faicad/faijs-extra` 迁出——它们的实现在扩展库的 mesh 面(`editorCad`)。
30
30
  */
31
31
  export declare const cad: {
32
32
  box: typeof primitives.box;
@@ -34,9 +34,7 @@ export declare const cad: {
34
34
  cylinder: typeof primitives.cylinder;
35
35
  cone: typeof primitives.cone;
36
36
  wedge: typeof primitives.wedge;
37
- text: typeof primitives.text;
38
37
  screw: typeof primitives.screw;
39
- svgExtrude: typeof primitives.svgExtrude;
40
38
  sdf: typeof primitives.sdf;
41
39
  boxBrep: typeof brepPrimitives.boxBrep;
42
40
  sphereBrep: typeof brepPrimitives.sphereBrep;
@@ -51,13 +49,6 @@ export declare const cad: {
51
49
  union: typeof booleanOps.union;
52
50
  subtract: typeof booleanOps.subtract;
53
51
  intersect: typeof booleanOps.intersect;
54
- fai_split: typeof splitOps.split;
55
- fai_splitWithParams: typeof splitOps.splitWithParams;
56
- dovetailSplit: typeof splitOps.dovetailSplit;
57
- dowelSplit: typeof splitOps.dowelSplit;
58
- tenonSplit: typeof splitOps.tenonSplit;
59
- fai_drill: typeof drillOps.drill;
60
- fai_extrude: typeof extrudeOps.extrude;
61
52
  engrave: typeof engraveOps.engrave;
62
53
  knurl: typeof engraveOps.knurl;
63
54
  boundingBox: typeof queryOps.boundingBox;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,UAAU,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,cAAc,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,KAAK,UAAU,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,eAAe,CAAA;AAC3C,OAAO,KAAK,UAAU,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,YAAY,MAAM,aAAa,CAAA;AAC3C,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,MAAM,CAAA;AAI7B;;;;GAIG;AACH,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEf,CAAA;AAID,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACvE,YAAY,EACV,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAChE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EACvC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EACtD,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,GACjF,MAAM,SAAS,CAAA;AAGhB,YAAY,EACV,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EACjE,iBAAiB,GAClB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,oBAAoB,EAAE,kBAAkB,EAAE,qBAAqB,EAC/D,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,UAAU,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,cAAc,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,KAAK,UAAU,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,YAAY,MAAM,aAAa,CAAA;AAC3C,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,MAAM,CAAA;AAI7B;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Df,CAAA;AAID,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACvE,YAAY,EACV,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAChE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EACvC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EACtD,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,GACjF,MAAM,SAAS,CAAA;AAGhB,YAAY,EACV,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EACjE,iBAAiB,GAClB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,oBAAoB,EAAE,kBAAkB,EAAE,qBAAqB,EAC/D,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAA"}
@@ -16,9 +16,6 @@ import * as primitives from './primitives.js';
16
16
  import * as brepPrimitives from '../brep/primitives-brep.js';
17
17
  import * as brepOps from '../brep/index.js';
18
18
  import * as booleanOps from './boolean.js';
19
- import * as splitOps from './fai_split.js';
20
- import * as drillOps from './fai_drill.js';
21
- import * as extrudeOps from './fai_extrude.js';
22
19
  import * as engraveOps from './engrave.js';
23
20
  import * as transformOps from './transform.js';
24
21
  import * as queryOps from './query.js';
@@ -26,8 +23,11 @@ import * as ioOps from './io.js';
26
23
  // ── 统一 cad API 对象 ──
27
24
  /**
28
25
  * Unified `cad` API object aggregating the pure-data mesh operations: mesh and
29
- * BREP primitives, transforms, booleans, splits, drill/extrude/engrave/knurl,
30
- * geometry queries, file IO, and BREP feature operations.
26
+ * BREP primitives, transforms, booleans, engrave/knurl, geometry queries, file
27
+ * IO, and BREP feature operations.
28
+ *
29
+ * D1(2026-09-23 扩展库拆分):`text` / `svgExtrude` / `fai_*` 键已随
30
+ * `@faicad/faijs-extra` 迁出——它们的实现在扩展库的 mesh 面(`editorCad`)。
31
31
  */
32
32
  export const cad = {
33
33
  // 创建(mesh 路径)
@@ -36,9 +36,7 @@ export const cad = {
36
36
  cylinder: primitives.cylinder,
37
37
  cone: primitives.cone,
38
38
  wedge: primitives.wedge,
39
- text: primitives.text,
40
39
  screw: primitives.screw,
41
- svgExtrude: primitives.svgExtrude,
42
40
  sdf: primitives.sdf,
43
41
  // 创建(BREP 路径 — OCCT 精确实体三角化)
44
42
  boxBrep: brepPrimitives.boxBrep,
@@ -57,17 +55,8 @@ export const cad = {
57
55
  subtract: booleanOps.subtract,
58
56
  intersect: booleanOps.intersect,
59
57
  // 分割
60
- // fai_* 键为 mesh 侧实现入口。DEPRECATED:`fai_` 前缀 op 是 ../3d_editor 项目
61
- // 特有的操作,将来迁出并从 faijs 删除(见 api/fai_*.ts 的 @deprecated)。
62
- fai_split: splitOps.split,
63
- fai_splitWithParams: splitOps.splitWithParams,
64
- dovetailSplit: splitOps.dovetailSplit,
65
- dowelSplit: splitOps.dowelSplit,
66
- tenonSplit: splitOps.tenonSplit,
67
- // 钻孔
68
- fai_drill: drillOps.drill,
69
- // 拉伸
70
- fai_extrude: extrudeOps.extrude,
58
+ // `fai_*` 键(编辑器消费面)已随扩展库迁出:@faicad/faijs-extra 的 mesh 面
59
+ // 经 `mesh/fai_split.ts` / `mesh/fai_drill.ts` / `mesh/fai_extrude.ts` 提供。
71
60
  // 雕刻
72
61
  engrave: engraveOps.engrave,
73
62
  knurl: engraveOps.knurl,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mesh — 纯数据几何 API 统一入口\n *\n * See docs/api-contract.md §1 (architecture layers) and §10 (stdlib function catalog).\n *\n * 原则(§5.1):\n * 1. 全部纯数据:输入输出是 Shape (ManifoldMeshData),不碰 THREE 场景、不读 store\n * 2. 不可变:每个 API 返回新几何,不修改输入\n * 3. 同步签名、异步执行:API 签名同步(或 async);worker 边界由 ScriptEngine 处理\n * 4. 坐标系:右手系 +Z 向上、毫米、角度用度\n *\n * P1 阶段:mesh 是对现有纯函数的薄包装层,行为完全不变。\n * P3+ 阶段:mesh 将由 ScriptEngine 驱动,在 worker 中执行。\n */\n\nimport * as primitives from './primitives'\nimport * as brepPrimitives from '../brep/primitives-brep'\nimport * as brepOps from '../brep'\nimport * as booleanOps from './boolean'\nimport * as splitOps from './fai_split'\nimport * as drillOps from './fai_drill'\nimport * as extrudeOps from './fai_extrude'\nimport * as engraveOps from './engrave'\nimport * as transformOps from './transform'\nimport * as queryOps from './query'\nimport * as ioOps from './io'\n\n// ── 统一 cad API 对象 ──\n\n/**\n * Unified `cad` API object aggregating the pure-data mesh operations: mesh and\n * BREP primitives, transforms, booleans, splits, drill/extrude/engrave/knurl,\n * geometry queries, file IO, and BREP feature operations.\n */\nexport const cad = {\n // 创建(mesh 路径)\n box: primitives.box,\n sphere: primitives.sphere,\n cylinder: primitives.cylinder,\n cone: primitives.cone,\n wedge: primitives.wedge,\n text: primitives.text,\n screw: primitives.screw,\n svgExtrude: primitives.svgExtrude,\n sdf: primitives.sdf,\n\n // 创建(BREP 路径 — OCCT 精确实体三角化)\n boxBrep: brepPrimitives.boxBrep,\n sphereBrep: brepPrimitives.sphereBrep,\n cylinderBrep: brepPrimitives.cylinderBrep,\n coneBrep: brepPrimitives.coneBrep,\n wedgeBrep: brepPrimitives.wedgeBrep,\n\n // 变换\n translate: transformOps.translate,\n rotate_euler: transformOps.rotate_euler,\n scale: transformOps.scale,\n scale3d: transformOps.scale3d,\n transformMatrix: transformOps.transformMatrix,\n\n // 布尔\n union: booleanOps.union,\n subtract: booleanOps.subtract,\n intersect: booleanOps.intersect,\n\n // 分割\n // fai_* 键为 mesh 侧实现入口。DEPRECATED:`fai_` 前缀 op 是 ../3d_editor 项目\n // 特有的操作,将来迁出并从 faijs 删除(见 api/fai_*.ts 的 @deprecated)。\n fai_split: splitOps.split,\n fai_splitWithParams: splitOps.splitWithParams,\n dovetailSplit: splitOps.dovetailSplit,\n dowelSplit: splitOps.dowelSplit,\n tenonSplit: splitOps.tenonSplit,\n\n // 钻孔\n fai_drill: drillOps.drill,\n\n // 拉伸\n fai_extrude: extrudeOps.extrude,\n\n // 雕刻\n engrave: engraveOps.engrave,\n knurl: engraveOps.knurl,\n\n // 查询\n boundingBox: queryOps.boundingBox,\n bboxCenter: queryOps.bboxCenter,\n volume: queryOps.volume,\n faceAt: queryOps.faceAt,\n\n // IO\n load: ioOps.importFile,\n\n // BREP 特征操作(Phase 2 — OCCT 精确实体运算)\n translateBrep: brepOps.translateBrep,\n rotateBrep: brepOps.rotateBrep,\n scaleBrep: brepOps.scaleBrep,\n fuseBrep: brepOps.fuseBrep,\n cutBrep: brepOps.cutBrep,\n commonBrep: brepOps.commonBrep,\n drillBrep: brepOps.drillBrep,\n splitBrep: brepOps.splitBrep,\n extrudeBrep: brepOps.extrudeBrep,\n loadBrep: brepOps.loadBrep,\n solidToShape: brepOps.solidToShape,\n}\n\n// ── 类型导出 ──\n\nexport type { Shape, Vec3, BoundingBox, FaceDescriptor } from './types'\nexport type {\n BoxParams, SphereParams, CylinderParams, ConeParams, WedgeParams,\n TextParams, SvgExtrudeParams, SdfParams,\n DrillParams, ExtrudeParams, EngraveParams, KnurlParams,\n SplitPlane, SplitResult, DovetailSplitParams, DowelSplitParams, TenonSplitParams,\n} from './types'\n\n// BREP ops 类型导出\nexport type {\n BrepChainState, DrillBrepParams, SplitBrepParams, SplitBrepResult,\n ExtrudeBrepParams,\n} from '../brep'\nexport {\n createBrepChainState, initBrepChainState, releaseBrepChainState,\n solidToShape,\n isCadFormat,\n} from '../brep'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,UAAU,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,cAAc,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,KAAK,UAAU,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,YAAY,MAAM,aAAa,CAAA;AAC3C,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,MAAM,CAAA;AAE7B,sBAAsB;AAEtB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,cAAc;IACd,GAAG,EAAE,UAAU,CAAC,GAAG;IACnB,MAAM,EAAE,UAAU,CAAC,MAAM;IACzB,QAAQ,EAAE,UAAU,CAAC,QAAQ;IAC7B,IAAI,EAAE,UAAU,CAAC,IAAI;IACrB,KAAK,EAAE,UAAU,CAAC,KAAK;IACvB,KAAK,EAAE,UAAU,CAAC,KAAK;IACvB,GAAG,EAAE,UAAU,CAAC,GAAG;IAEnB,6BAA6B;IAC7B,OAAO,EAAE,cAAc,CAAC,OAAO;IAC/B,UAAU,EAAE,cAAc,CAAC,UAAU;IACrC,YAAY,EAAE,cAAc,CAAC,YAAY;IACzC,QAAQ,EAAE,cAAc,CAAC,QAAQ;IACjC,SAAS,EAAE,cAAc,CAAC,SAAS;IAEnC,KAAK;IACL,SAAS,EAAE,YAAY,CAAC,SAAS;IACjC,YAAY,EAAE,YAAY,CAAC,YAAY;IACvC,KAAK,EAAE,YAAY,CAAC,KAAK;IACzB,OAAO,EAAE,YAAY,CAAC,OAAO;IAC7B,eAAe,EAAE,YAAY,CAAC,eAAe;IAE7C,KAAK;IACL,KAAK,EAAE,UAAU,CAAC,KAAK;IACvB,QAAQ,EAAE,UAAU,CAAC,QAAQ;IAC7B,SAAS,EAAE,UAAU,CAAC,SAAS;IAE/B,KAAK;IACL,wDAAwD;IACxD,0EAA0E;IAE1E,KAAK;IACL,OAAO,EAAE,UAAU,CAAC,OAAO;IAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;IAEvB,KAAK;IACL,WAAW,EAAE,QAAQ,CAAC,WAAW;IACjC,UAAU,EAAE,QAAQ,CAAC,UAAU;IAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;IAEvB,KAAK;IACL,IAAI,EAAE,KAAK,CAAC,UAAU;IAEtB,mCAAmC;IACnC,aAAa,EAAE,OAAO,CAAC,aAAa;IACpC,UAAU,EAAE,OAAO,CAAC,UAAU;IAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;IAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;IAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;IACxB,UAAU,EAAE,OAAO,CAAC,UAAU;IAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;IAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;IAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;IAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;IAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;CACnC,CAAA;AAiBD,OAAO,EACL,oBAAoB,EAAE,kBAAkB,EAAE,qBAAqB,EAC/D,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAA","sourcesContent":["/**\n * mesh — 纯数据几何 API 统一入口\n *\n * See docs/api-contract.md §1 (architecture layers) and §10 (stdlib function catalog).\n *\n * 原则(§5.1):\n * 1. 全部纯数据:输入输出是 Shape (ManifoldMeshData),不碰 THREE 场景、不读 store\n * 2. 不可变:每个 API 返回新几何,不修改输入\n * 3. 同步签名、异步执行:API 签名同步(或 async);worker 边界由 ScriptEngine 处理\n * 4. 坐标系:右手系 +Z 向上、毫米、角度用度\n *\n * P1 阶段:mesh 是对现有纯函数的薄包装层,行为完全不变。\n * P3+ 阶段:mesh 将由 ScriptEngine 驱动,在 worker 中执行。\n */\n\nimport * as primitives from './primitives'\nimport * as brepPrimitives from '../brep/primitives-brep'\nimport * as brepOps from '../brep'\nimport * as booleanOps from './boolean'\nimport * as engraveOps from './engrave'\nimport * as transformOps from './transform'\nimport * as queryOps from './query'\nimport * as ioOps from './io'\n\n// ── 统一 cad API 对象 ──\n\n/**\n * Unified `cad` API object aggregating the pure-data mesh operations: mesh and\n * BREP primitives, transforms, booleans, engrave/knurl, geometry queries, file\n * IO, and BREP feature operations.\n *\n * D1(2026-09-23 扩展库拆分):`text` / `svgExtrude` / `fai_*` 键已随\n * `@faicad/faijs-extra` 迁出——它们的实现在扩展库的 mesh 面(`editorCad`)。\n */\nexport const cad = {\n // 创建(mesh 路径)\n box: primitives.box,\n sphere: primitives.sphere,\n cylinder: primitives.cylinder,\n cone: primitives.cone,\n wedge: primitives.wedge,\n screw: primitives.screw,\n sdf: primitives.sdf,\n\n // 创建(BREP 路径 — OCCT 精确实体三角化)\n boxBrep: brepPrimitives.boxBrep,\n sphereBrep: brepPrimitives.sphereBrep,\n cylinderBrep: brepPrimitives.cylinderBrep,\n coneBrep: brepPrimitives.coneBrep,\n wedgeBrep: brepPrimitives.wedgeBrep,\n\n // 变换\n translate: transformOps.translate,\n rotate_euler: transformOps.rotate_euler,\n scale: transformOps.scale,\n scale3d: transformOps.scale3d,\n transformMatrix: transformOps.transformMatrix,\n\n // 布尔\n union: booleanOps.union,\n subtract: booleanOps.subtract,\n intersect: booleanOps.intersect,\n\n // 分割\n // `fai_*` 键(编辑器消费面)已随扩展库迁出:@faicad/faijs-extra 的 mesh 面\n // 经 `mesh/fai_split.ts` / `mesh/fai_drill.ts` / `mesh/fai_extrude.ts` 提供。\n\n // 雕刻\n engrave: engraveOps.engrave,\n knurl: engraveOps.knurl,\n\n // 查询\n boundingBox: queryOps.boundingBox,\n bboxCenter: queryOps.bboxCenter,\n volume: queryOps.volume,\n faceAt: queryOps.faceAt,\n\n // IO\n load: ioOps.importFile,\n\n // BREP 特征操作(Phase 2 — OCCT 精确实体运算)\n translateBrep: brepOps.translateBrep,\n rotateBrep: brepOps.rotateBrep,\n scaleBrep: brepOps.scaleBrep,\n fuseBrep: brepOps.fuseBrep,\n cutBrep: brepOps.cutBrep,\n commonBrep: brepOps.commonBrep,\n drillBrep: brepOps.drillBrep,\n splitBrep: brepOps.splitBrep,\n extrudeBrep: brepOps.extrudeBrep,\n loadBrep: brepOps.loadBrep,\n solidToShape: brepOps.solidToShape,\n}\n\n// ── 类型导出 ──\n\nexport type { Shape, Vec3, BoundingBox, FaceDescriptor } from './types'\nexport type {\n BoxParams, SphereParams, CylinderParams, ConeParams, WedgeParams,\n TextParams, SvgExtrudeParams, SdfParams,\n DrillParams, ExtrudeParams, EngraveParams, KnurlParams,\n SplitPlane, SplitResult, DovetailSplitParams, DowelSplitParams, TenonSplitParams,\n} from './types'\n\n// BREP ops 类型导出\nexport type {\n BrepChainState, DrillBrepParams, SplitBrepParams, SplitBrepResult,\n ExtrudeBrepParams,\n} from '../brep'\nexport {\n createBrepChainState, initBrepChainState, releaseBrepChainState,\n solidToShape,\n isCadFormat,\n} from '../brep'\n"]}
package/dist/mesh/io.d.ts CHANGED
@@ -2,7 +2,8 @@
2
2
  * mesh IO API — headless 文件加载
3
3
  *
4
4
  * 替代浏览器版的 io.ts(依赖 fileBlobStore / formatLoaders / model-store)。
5
- * 仅使用 THREE.js 的 loader(STLLoader)解析文件字节为 Shape。
5
+ * STL 由 core 自持的 `mesh/stl-loader.ts` 解析(零 three addons——`three/examples`
6
+ * 不在 three 的版本兼容承诺内,且会把不可控模块带进每个消费方,含小程序 worker)。
6
7
  */
7
8
  import type { Shape } from './types.js';
8
9
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/mesh/io.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC,CAiBhB"}
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/mesh/io.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC,CAahB"}
package/dist/mesh/io.js CHANGED
@@ -2,9 +2,11 @@
2
2
  * mesh IO API — headless 文件加载
3
3
  *
4
4
  * 替代浏览器版的 io.ts(依赖 fileBlobStore / formatLoaders / model-store)。
5
- * 仅使用 THREE.js 的 loader(STLLoader)解析文件字节为 Shape。
5
+ * STL 由 core 自持的 `mesh/stl-loader.ts` 解析(零 three addons——`three/examples`
6
+ * 不在 three 的版本兼容承诺内,且会把不可控模块带进每个消费方,含小程序 worker)。
6
7
  */
7
8
  import { geoToManifoldMesh } from '../boolean/geo-convert.js';
9
+ import { parseStl } from './stl-loader.js';
8
10
  /**
9
11
  * Load geometry from raw file bytes (headless variant). STL is parsed
10
12
  * directly; unsupported formats fall back to STL parsing.
@@ -16,15 +18,11 @@ import { geoToManifoldMesh } from '../boolean/geo-convert.js';
16
18
  export async function importFile(buffer, format) {
17
19
  const fmt = (format ?? 'stl').toLowerCase();
18
20
  if (fmt === 'stl') {
19
- const { STLLoader } = await import('three/examples/jsm/loaders/STLLoader.js');
20
- const geo = new STLLoader().parse(buffer);
21
- return geoToManifoldMesh(geo);
21
+ return geoToManifoldMesh(parseStl(buffer));
22
22
  }
23
23
  // For other formats, try STL as fallback
24
24
  try {
25
- const { STLLoader } = await import('three/examples/jsm/loaders/STLLoader.js');
26
- const geo = new STLLoader().parse(buffer);
27
- return geoToManifoldMesh(geo);
25
+ return geoToManifoldMesh(parseStl(buffer));
28
26
  }
29
27
  catch {
30
28
  throw new Error(`[mesh/io] unsupported format: ${fmt}`);
@@ -1 +1 @@
1
- {"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/mesh/io.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG1D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAmB,EACnB,MAAe;IAEf,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;IAE3C,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAA;QAC7E,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACzC,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAA;QAC7E,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACzC,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAA;IACzD,CAAC;AACH,CAAC","sourcesContent":["/**\n * mesh IO API — headless 文件加载\n *\n * 替代浏览器版的 io.ts(依赖 fileBlobStore / formatLoaders / model-store)。\n * 仅使用 THREE.js 的 loader(STLLoader)解析文件字节为 Shape。\n */\n\nimport { geoToManifoldMesh } from '../boolean/geo-convert'\nimport type { Shape } from './types'\n\n/**\n * Load geometry from raw file bytes (headless variant). STL is parsed\n * directly; unsupported formats fall back to STL parsing.\n *\n * @param buffer - the raw file bytes to parse.\n * @param format - format identifier such as 'stl' (defaults to 'stl').\n * @returns the loaded shape.\n */\nexport async function importFile(\n buffer: ArrayBuffer,\n format?: string,\n): Promise<Shape> {\n const fmt = (format ?? 'stl').toLowerCase()\n\n if (fmt === 'stl') {\n const { STLLoader } = await import('three/examples/jsm/loaders/STLLoader.js')\n const geo = new STLLoader().parse(buffer)\n return geoToManifoldMesh(geo)\n }\n\n // For other formats, try STL as fallback\n try {\n const { STLLoader } = await import('three/examples/jsm/loaders/STLLoader.js')\n const geo = new STLLoader().parse(buffer)\n return geoToManifoldMesh(geo)\n } catch {\n throw new Error(`[mesh/io] unsupported format: ${fmt}`)\n }\n}\n"]}
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/mesh/io.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAGvC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAmB,EACnB,MAAe;IAEf,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;IAE3C,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,OAAO,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC;QACH,OAAO,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAA;IACzD,CAAC;AACH,CAAC","sourcesContent":["/**\n * mesh IO API — headless 文件加载\n *\n * 替代浏览器版的 io.ts(依赖 fileBlobStore / formatLoaders / model-store)。\n * STL 由 core 自持的 `mesh/stl-loader.ts` 解析(零 three addons——`three/examples`\n * 不在 three 的版本兼容承诺内,且会把不可控模块带进每个消费方,含小程序 worker)。\n */\n\nimport { geoToManifoldMesh } from '../boolean/geo-convert'\nimport { parseStl } from './stl-loader'\nimport type { Shape } from './types'\n\n/**\n * Load geometry from raw file bytes (headless variant). STL is parsed\n * directly; unsupported formats fall back to STL parsing.\n *\n * @param buffer - the raw file bytes to parse.\n * @param format - format identifier such as 'stl' (defaults to 'stl').\n * @returns the loaded shape.\n */\nexport async function importFile(\n buffer: ArrayBuffer,\n format?: string,\n): Promise<Shape> {\n const fmt = (format ?? 'stl').toLowerCase()\n\n if (fmt === 'stl') {\n return geoToManifoldMesh(parseStl(buffer))\n }\n\n // For other formats, try STL as fallback\n try {\n return geoToManifoldMesh(parseStl(buffer))\n } catch {\n throw new Error(`[mesh/io] unsupported format: ${fmt}`)\n }\n}\n"]}
@@ -3,14 +3,16 @@
3
3
  *
4
4
  * 提取来源(§5.7):
5
5
  * - box/sphere/cylinder/cone/wedge ← engine/primitives/mesh-primitives.ts (makePrimitiveGeo)
6
- * - text ← engine/components/engraving/EngravingCore.ts (createTextGeometry)
7
6
  * - screw ← engine/primitives/screw/screw.ts (makeScrew)
8
- * - svgExtrude ← engine/primitives/svg-extrude/ (svgToExtrudedGeometry)
7
+ *
8
+ * `text` / `svgExtrude`(three 的 Shape / ExtrudeGeometry / SVGLoader 链)已随
9
+ * B 组迁到 `@faicad/faijs-extra` 的 `mesh/primitives.ts`,core 的 mesh 面不再
10
+ * 承载 three 的非基础几何生成链。
9
11
  *
10
12
  * 所有函数返回 Shape (ManifoldMeshData):THREE.BufferGeometry → geoToManifoldMesh 转换。
11
13
  * 坐标系:Z-up、毫米。
12
14
  */
13
- import type { Shape, BoxParams, SphereParams, CylinderParams, ConeParams, WedgeParams, TextParams, SvgExtrudeParams, SdfParams } from './types.js';
15
+ import type { Shape, BoxParams, SphereParams, CylinderParams, ConeParams, WedgeParams, SdfParams } from './types.js';
14
16
  /**
15
17
  * Create a box solid (brepjs contract, §4.1 A 决策).
16
18
  *
@@ -63,14 +65,6 @@ export declare function cone(params: ConeParams): Shape;
63
65
  * @returns the wedge shape.
64
66
  */
65
67
  export declare function wedge(params: WedgeParams): Shape;
66
- /**
67
- * Create text geometry. Font loading is asynchronous, so this function is
68
- * async; CJK text is rendered with the system font when one is available.
69
- *
70
- * @param params - text parameters (text, size, depth).
71
- * @returns the text shape.
72
- */
73
- export declare function text(params: TextParams): Promise<Shape>;
74
68
  /**
75
69
  * Create a screw (threaded) geometry.
76
70
  *
@@ -86,13 +80,6 @@ export declare function screw(params: {
86
80
  head: 'hex' | 'chc' | 'none';
87
81
  nRad?: number;
88
82
  }): Promise<Shape>;
89
- /**
90
- * Create an extruded geometry from an SVG source.
91
- *
92
- * @param params - SVG extrude parameters (svg, depth, target size, optional natural size).
93
- * @returns the extruded shape.
94
- */
95
- export declare function svgExtrude(params: SvgExtrudeParams): Shape;
96
83
  /**
97
84
  * Create a mesh from SDF (signed distance field) code, sampling the field with
98
85
  * marching cubes.
@@ -1 +1 @@
1
- {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/mesh/primitives.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAY/I;;;;;;;;;;;GAWG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,CAsB5C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,KAAK,CAOlD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,KAAK,CAWtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CA8B9C;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CA0DhD;AAED;;;;;;GAMG;AACH,wBAAsB,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAwB7D;AAED;;;;;GAKG;AACH,wBAAsB,KAAK,CAAC,MAAM,EAAE;IAClC,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,OAAO,CAAC,KAAK,CAAC,CAYjB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,KAAK,CAQ1D;AAED;;;;;;GAMG;AACH,wBAAsB,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAc3D"}
1
+ {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/mesh/primitives.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAYjH;;;;;;;;;;;GAWG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,CAsB5C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,KAAK,CAOlD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,KAAK,CAWtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CA8B9C;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CA0DhD;AAED;;;;;GAKG;AACH,wBAAsB,KAAK,CAAC,MAAM,EAAE;IAClC,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,OAAO,CAAC,KAAK,CAAC,CAYjB;AAED;;;;;;GAMG;AACH,wBAAsB,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAc3D"}
@@ -3,9 +3,11 @@
3
3
  *
4
4
  * 提取来源(§5.7):
5
5
  * - box/sphere/cylinder/cone/wedge ← engine/primitives/mesh-primitives.ts (makePrimitiveGeo)
6
- * - text ← engine/components/engraving/EngravingCore.ts (createTextGeometry)
7
6
  * - screw ← engine/primitives/screw/screw.ts (makeScrew)
8
- * - svgExtrude ← engine/primitives/svg-extrude/ (svgToExtrudedGeometry)
7
+ *
8
+ * `text` / `svgExtrude`(three 的 Shape / ExtrudeGeometry / SVGLoader 链)已随
9
+ * B 组迁到 `@faicad/faijs-extra` 的 `mesh/primitives.ts`,core 的 mesh 面不再
10
+ * 承载 three 的非基础几何生成链。
9
11
  *
10
12
  * 所有函数返回 Shape (ManifoldMeshData):THREE.BufferGeometry → geoToManifoldMesh 转换。
11
13
  * 坐标系:Z-up、毫米。
@@ -13,7 +15,6 @@
13
15
  import * as THREE from 'three';
14
16
  import { makePrimitiveGeo } from '../primitives/mesh-primitives.js';
15
17
  import { geoToManifoldMesh } from '../boolean/csg-backend.js';
16
- import { svgToExtrudedGeometry } from '../primitives/svg-extrude.js';
17
18
  import { clampNRad } from './types.js';
18
19
  // ── 内部工具 ──
19
20
  /** THREE.BufferGeometry → Shape (ManifoldMeshData) */
@@ -191,36 +192,6 @@ export function wedge(params) {
191
192
  }
192
193
  return geoToShape(geo);
193
194
  }
194
- /**
195
- * Create text geometry. Font loading is asynchronous, so this function is
196
- * async; CJK text is rendered with the system font when one is available.
197
- *
198
- * @param params - text parameters (text, size, depth).
199
- * @returns the text shape.
200
- */
201
- export async function text(params) {
202
- const { getOpentypeFont, createTextGeometry } = await import('../primitives/text-geometry.js');
203
- const { containsCjk, loadSystemCjkFont, createMixedTextGeometry } = await import('../primitives/text/cjk.js');
204
- const font = await getOpentypeFont();
205
- let geo;
206
- if (containsCjk(params.text)) {
207
- const cjkFont = await loadSystemCjkFont();
208
- if (cjkFont) {
209
- geo = await createMixedTextGeometry(params.text, params.size, params.depth, cjkFont.font, font);
210
- }
211
- else {
212
- // No CJK font available: replace CJK chars with '?' so geometry still
213
- // can be created (graceful degradation). Without this, createTextGeometry
214
- // would throw because CJK glyphs are .notdef in OpenSans Regular.
215
- const fallback = params.text.replace(/[\u4E00-\u9FFF\u3400-\u4DBF\u2F800-\u2FA1F\u3000-\u303F\uFF00-\uFFEF]/g, '?');
216
- geo = await createTextGeometry(fallback, params.size, params.depth, font);
217
- }
218
- }
219
- else {
220
- geo = await createTextGeometry(params.text, params.size, params.depth, font);
221
- }
222
- return geoToShape(geo);
223
- }
224
195
  /**
225
196
  * Create a screw (threaded) geometry.
226
197
  *
@@ -240,21 +211,6 @@ export async function screw(params) {
240
211
  });
241
212
  return geoToShape(geo);
242
213
  }
243
- /**
244
- * Create an extruded geometry from an SVG source.
245
- *
246
- * @param params - SVG extrude parameters (svg, depth, target size, optional natural size).
247
- * @returns the extruded shape.
248
- */
249
- export function svgExtrude(params) {
250
- const geo = svgToExtrudedGeometry(params.svg, {
251
- depth: params.depth,
252
- targetLongSide: params.targetLongSide ?? 20,
253
- naturalWidth: params.naturalWidth ?? 0,
254
- naturalHeight: params.naturalHeight ?? 0,
255
- });
256
- return geoToShape(geo);
257
- }
258
214
  /**
259
215
  * Create a mesh from SDF (signed distance field) code, sampling the field with
260
216
  * marching cubes.