@faicad/faijs 0.33.2 → 0.35.8

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 (429) hide show
  1. package/dist/api/api-namespace.d.ts +14 -14
  2. package/dist/api/api-namespace.d.ts.map +1 -1
  3. package/dist/api/api-namespace.js +40 -14
  4. package/dist/api/api-namespace.js.map +1 -1
  5. package/dist/api/appearance.d.ts +47 -6
  6. package/dist/api/appearance.d.ts.map +1 -1
  7. package/dist/api/appearance.js.map +1 -1
  8. package/dist/api/assembly/entities.js +14 -4
  9. package/dist/api/assembly/entities.js.map +1 -1
  10. package/dist/api/assembly/solve-tree.d.ts +1 -0
  11. package/dist/api/assembly/solve-tree.d.ts.map +1 -1
  12. package/dist/api/assembly/solve-tree.js +42 -17
  13. package/dist/api/assembly/solve-tree.js.map +1 -1
  14. package/dist/api/assembly/solve.d.ts +1 -0
  15. package/dist/api/assembly/solve.d.ts.map +1 -1
  16. package/dist/api/assembly/solve.js.map +1 -1
  17. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  18. package/dist/api/assembly/solvers/global-solver.js +130 -23
  19. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  20. package/dist/api/assembly/solvers/pose-from-delta.d.ts +9 -0
  21. package/dist/api/assembly/solvers/pose-from-delta.d.ts.map +1 -1
  22. package/dist/api/assembly/solvers/pose-from-delta.js +23 -0
  23. package/dist/api/assembly/solvers/pose-from-delta.js.map +1 -1
  24. package/dist/api/assembly/solvers/types.d.ts +20 -2
  25. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  26. package/dist/api/assembly/solvers/types.js.map +1 -1
  27. package/dist/api/chamfer.d.ts +7 -4
  28. package/dist/api/chamfer.d.ts.map +1 -1
  29. package/dist/api/chamfer.js +57 -13
  30. package/dist/api/chamfer.js.map +1 -1
  31. package/dist/api/draft.d.ts +7 -4
  32. package/dist/api/draft.d.ts.map +1 -1
  33. package/dist/api/draft.js +11 -6
  34. package/dist/api/draft.js.map +1 -1
  35. package/dist/api/edge-ref.d.ts +4 -4
  36. package/dist/api/edge-ref.js +4 -4
  37. package/dist/api/edge-ref.js.map +1 -1
  38. package/dist/api/extrude.d.ts +10 -6
  39. package/dist/api/extrude.d.ts.map +1 -1
  40. package/dist/api/extrude.js +54 -26
  41. package/dist/api/extrude.js.map +1 -1
  42. package/dist/api/face-ref.d.ts +4 -4
  43. package/dist/api/face-ref.js +4 -4
  44. package/dist/api/face-ref.js.map +1 -1
  45. package/dist/api/feature-repair.d.ts +6 -3
  46. package/dist/api/feature-repair.d.ts.map +1 -1
  47. package/dist/api/feature-repair.js +12 -7
  48. package/dist/api/feature-repair.js.map +1 -1
  49. package/dist/api/fillet-variable.d.ts +6 -2
  50. package/dist/api/fillet-variable.d.ts.map +1 -1
  51. package/dist/api/fillet-variable.js +24 -6
  52. package/dist/api/fillet-variable.js.map +1 -1
  53. package/dist/api/fillet.d.ts +7 -4
  54. package/dist/api/fillet.d.ts.map +1 -1
  55. package/dist/api/fillet.js +92 -12
  56. package/dist/api/fillet.js.map +1 -1
  57. package/dist/api/generated/script-face-manifest.js +1 -1
  58. package/dist/api/generated/script-face-manifest.js.map +1 -1
  59. package/dist/api/generated/topology.js +1 -1
  60. package/dist/api/generated/topology.js.map +1 -1
  61. package/dist/api/helix.d.ts +13 -13
  62. package/dist/api/helix.d.ts.map +1 -1
  63. package/dist/api/helix.js +19 -24
  64. package/dist/api/helix.js.map +1 -1
  65. package/dist/api/import-brep.d.ts +10 -18
  66. package/dist/api/import-brep.d.ts.map +1 -1
  67. package/dist/api/import-brep.js +17 -25
  68. package/dist/api/import-brep.js.map +1 -1
  69. package/dist/api/import-step.d.ts +10 -15
  70. package/dist/api/import-step.d.ts.map +1 -1
  71. package/dist/api/import-step.js +24 -29
  72. package/dist/api/import-step.js.map +1 -1
  73. package/dist/api/index.js +2 -2
  74. package/dist/api/index.js.map +1 -1
  75. package/dist/api/internal/export-members.js.map +1 -1
  76. package/dist/api/loft-advanced.d.ts +4 -0
  77. package/dist/api/loft-advanced.d.ts.map +1 -1
  78. package/dist/api/loft-advanced.js +4 -0
  79. package/dist/api/loft-advanced.js.map +1 -1
  80. package/dist/api/loft.d.ts +5 -3
  81. package/dist/api/loft.d.ts.map +1 -1
  82. package/dist/api/loft.js +5 -3
  83. package/dist/api/loft.js.map +1 -1
  84. package/dist/api/meta.d.ts +42 -6
  85. package/dist/api/meta.d.ts.map +1 -1
  86. package/dist/api/meta.js.map +1 -1
  87. package/dist/api/primitives.d.ts +3 -2
  88. package/dist/api/primitives.d.ts.map +1 -1
  89. package/dist/api/primitives.js +3 -2
  90. package/dist/api/primitives.js.map +1 -1
  91. package/dist/api/punch-hole.d.ts +5 -2
  92. package/dist/api/punch-hole.d.ts.map +1 -1
  93. package/dist/api/punch-hole.js +4 -1
  94. package/dist/api/punch-hole.js.map +1 -1
  95. package/dist/api/replicate.d.ts +4 -5
  96. package/dist/api/replicate.d.ts.map +1 -1
  97. package/dist/api/replicate.js +4 -5
  98. package/dist/api/replicate.js.map +1 -1
  99. package/dist/api/selectors-to-refs.d.ts +83 -0
  100. package/dist/api/selectors-to-refs.d.ts.map +1 -0
  101. package/dist/api/selectors-to-refs.js +211 -0
  102. package/dist/api/selectors-to-refs.js.map +1 -0
  103. package/dist/api/shell.d.ts +17 -8
  104. package/dist/api/shell.d.ts.map +1 -1
  105. package/dist/api/shell.js +45 -15
  106. package/dist/api/shell.js.map +1 -1
  107. package/dist/api/sketch-on-face.d.ts +12 -6
  108. package/dist/api/sketch-on-face.d.ts.map +1 -1
  109. package/dist/api/sketch-on-face.js +31 -4
  110. package/dist/api/sketch-on-face.js.map +1 -1
  111. package/dist/api/sketch-on-plane.d.ts +3 -0
  112. package/dist/api/sketch-on-plane.d.ts.map +1 -1
  113. package/dist/api/sketch-on-plane.js +3 -0
  114. package/dist/api/sketch-on-plane.js.map +1 -1
  115. package/dist/api/sketch-on-surface.d.ts +4 -1
  116. package/dist/api/sketch-on-surface.d.ts.map +1 -1
  117. package/dist/api/sketch-on-surface.js +4 -1
  118. package/dist/api/sketch-on-surface.js.map +1 -1
  119. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  120. package/dist/api/surface/arg-spec.js +5 -6
  121. package/dist/api/surface/arg-spec.js.map +1 -1
  122. package/dist/api/topo-resolve.d.ts.map +1 -1
  123. package/dist/api/topo-resolve.js +24 -5
  124. package/dist/api/topo-resolve.js.map +1 -1
  125. package/dist/api/view/view-projection.d.ts.map +1 -1
  126. package/dist/api/view/view-projection.js +9 -2
  127. package/dist/api/view/view-projection.js.map +1 -1
  128. package/dist/brep/brep-chain.js +2 -2
  129. package/dist/brep/brep-chain.js.map +1 -1
  130. package/dist/brep/brep-ops.d.ts +1 -1
  131. package/dist/brep/brep-ops.js +1 -1
  132. package/dist/brep/brep-ops.js.map +1 -1
  133. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  134. package/dist/brep/engine/adapters/brep-mock.js +45 -0
  135. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  136. package/dist/brep/engine/primitives.d.ts +87 -3
  137. package/dist/brep/engine/primitives.d.ts.map +1 -1
  138. package/dist/brep/engine/primitives.js +1 -1
  139. package/dist/brep/engine/primitives.js.map +1 -1
  140. package/dist/brep/engine/registry.d.ts +33 -7
  141. package/dist/brep/engine/registry.d.ts.map +1 -1
  142. package/dist/brep/engine/registry.js +47 -16
  143. package/dist/brep/engine/registry.js.map +1 -1
  144. package/dist/brep/handle-bridge.d.ts +14 -15
  145. package/dist/brep/handle-bridge.d.ts.map +1 -1
  146. package/dist/brep/handle-bridge.js +35 -15
  147. package/dist/brep/handle-bridge.js.map +1 -1
  148. package/dist/brep/primitives-brep.js +2 -2
  149. package/dist/brep/primitives-brep.js.map +1 -1
  150. package/dist/brep/text/text-to-solid.d.ts +40 -3
  151. package/dist/brep/text/text-to-solid.d.ts.map +1 -1
  152. package/dist/brep/text/text-to-solid.js +104 -24
  153. package/dist/brep/text/text-to-solid.js.map +1 -1
  154. package/dist/brepkit-kernel/brepkitKernel.d.ts +2 -2
  155. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  156. package/dist/brepkit-kernel/brepkitKernel.js +328 -38
  157. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  158. package/dist/brepkit-kernel/brepkitWasm.d.ts +3 -1
  159. package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
  160. package/dist/brepkit-kernel/brepkitWasm.js +13 -9
  161. package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
  162. package/dist/brepkit-kernel/multi-version-test.d.ts +2 -2
  163. package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -1
  164. package/dist/brepkit-kernel/multi-version-test.js +6 -6
  165. package/dist/brepkit-kernel/multi-version-test.js.map +1 -1
  166. package/dist/browser.d.ts +2 -3
  167. package/dist/browser.d.ts.map +1 -1
  168. package/dist/browser.js +1 -2
  169. package/dist/browser.js.map +1 -1
  170. package/dist/cad-runtime/admit-compat-lib.d.ts +9 -1
  171. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  172. package/dist/cad-runtime/admit-compat-lib.js +11 -1
  173. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  174. package/dist/cad-runtime/browser-lib-loader.d.ts +16 -11
  175. package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
  176. package/dist/cad-runtime/browser-lib-loader.js +16 -8
  177. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  178. package/dist/cad-runtime/direct-executor.d.ts +62 -5
  179. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  180. package/dist/cad-runtime/direct-executor.js +617 -42
  181. package/dist/cad-runtime/direct-executor.js.map +1 -1
  182. package/dist/cad-runtime/interp/closure.d.ts +3 -2
  183. package/dist/cad-runtime/interp/closure.d.ts.map +1 -1
  184. package/dist/cad-runtime/interp/closure.js.map +1 -1
  185. package/dist/cad-runtime/interp/env.d.ts +9 -6
  186. package/dist/cad-runtime/interp/env.d.ts.map +1 -1
  187. package/dist/cad-runtime/interp/env.js +4 -2
  188. package/dist/cad-runtime/interp/env.js.map +1 -1
  189. package/dist/cad-runtime/lib-decl.d.ts +121 -0
  190. package/dist/cad-runtime/lib-decl.d.ts.map +1 -0
  191. package/dist/cad-runtime/lib-decl.js +100 -0
  192. package/dist/cad-runtime/lib-decl.js.map +1 -0
  193. package/dist/cad-runtime/ports.d.ts +12 -0
  194. package/dist/cad-runtime/ports.d.ts.map +1 -1
  195. package/dist/cad-runtime/ports.js.map +1 -1
  196. package/dist/cad-runtime/runtime.d.ts +59 -5
  197. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  198. package/dist/cad-runtime/runtime.js +252 -20
  199. package/dist/cad-runtime/runtime.js.map +1 -1
  200. package/dist/extra/browser.d.ts +9 -0
  201. package/dist/extra/browser.d.ts.map +1 -0
  202. package/dist/extra/browser.js +9 -0
  203. package/dist/extra/browser.js.map +1 -0
  204. package/dist/extra/editor-ops.d.ts +22 -0
  205. package/dist/extra/editor-ops.d.ts.map +1 -0
  206. package/dist/extra/editor-ops.js +21 -0
  207. package/dist/extra/editor-ops.js.map +1 -0
  208. package/dist/extra/extras/svg-extrude.d.ts +45 -0
  209. package/dist/extra/extras/svg-extrude.d.ts.map +1 -0
  210. package/dist/extra/extras/svg-extrude.js +110 -0
  211. package/dist/extra/extras/svg-extrude.js.map +1 -0
  212. package/dist/extra/extras/text-cjk.d.ts +36 -0
  213. package/dist/extra/extras/text-cjk.d.ts.map +1 -0
  214. package/dist/extra/extras/text-cjk.js +86 -0
  215. package/dist/extra/extras/text-cjk.js.map +1 -0
  216. package/dist/extra/extras/text-geometry.d.ts +69 -0
  217. package/dist/extra/extras/text-geometry.d.ts.map +1 -0
  218. package/dist/extra/extras/text-geometry.js +188 -0
  219. package/dist/extra/extras/text-geometry.js.map +1 -0
  220. package/dist/extra/index.d.ts +40 -0
  221. package/dist/extra/index.d.ts.map +1 -0
  222. package/dist/extra/index.js +40 -0
  223. package/dist/extra/index.js.map +1 -0
  224. package/dist/extra/mesh/drill-hole/DrillHoleCore.d.ts +94 -0
  225. package/dist/extra/mesh/drill-hole/DrillHoleCore.d.ts.map +1 -0
  226. package/dist/extra/mesh/drill-hole/DrillHoleCore.js +282 -0
  227. package/dist/extra/mesh/drill-hole/DrillHoleCore.js.map +1 -0
  228. package/dist/extra/mesh/drill-hole/drill-types.d.ts +34 -0
  229. package/dist/extra/mesh/drill-hole/drill-types.d.ts.map +1 -0
  230. package/dist/extra/mesh/drill-hole/drill-types.js +7 -0
  231. package/dist/extra/mesh/drill-hole/drill-types.js.map +1 -0
  232. package/dist/extra/mesh/engrave-decoration.d.ts +42 -0
  233. package/dist/extra/mesh/engrave-decoration.d.ts.map +1 -0
  234. package/dist/extra/mesh/engrave-decoration.js +39 -0
  235. package/dist/extra/mesh/engrave-decoration.js.map +1 -0
  236. package/dist/extra/mesh/fai_drill.d.ts +21 -0
  237. package/dist/extra/mesh/fai_drill.d.ts.map +1 -0
  238. package/dist/extra/mesh/fai_drill.js +89 -0
  239. package/dist/extra/mesh/fai_drill.js.map +1 -0
  240. package/dist/extra/mesh/fai_extrude.d.ts +24 -0
  241. package/dist/extra/mesh/fai_extrude.d.ts.map +1 -0
  242. package/dist/extra/mesh/fai_extrude.js +42 -0
  243. package/dist/extra/mesh/fai_extrude.js.map +1 -0
  244. package/dist/extra/mesh/fai_split.d.ts +164 -0
  245. package/dist/extra/mesh/fai_split.d.ts.map +1 -0
  246. package/dist/extra/mesh/fai_split.js +269 -0
  247. package/dist/extra/mesh/fai_split.js.map +1 -0
  248. package/dist/extra/mesh/primitives.d.ts +29 -0
  249. package/dist/extra/mesh/primitives.d.ts.map +1 -0
  250. package/dist/extra/mesh/primitives.js +41 -0
  251. package/dist/extra/mesh/primitives.js.map +1 -0
  252. package/dist/extra/op-names.d.ts +37 -0
  253. package/dist/extra/op-names.d.ts.map +1 -0
  254. package/dist/extra/op-names.js +46 -0
  255. package/dist/extra/op-names.js.map +1 -0
  256. package/dist/extra/ops/compound.d.ts +140 -0
  257. package/dist/extra/ops/compound.d.ts.map +1 -0
  258. package/dist/extra/ops/compound.js +167 -0
  259. package/dist/extra/ops/compound.js.map +1 -0
  260. package/dist/extra/ops/copy.d.ts +40 -0
  261. package/dist/extra/ops/copy.d.ts.map +1 -0
  262. package/dist/extra/ops/copy.js +83 -0
  263. package/dist/extra/ops/copy.js.map +1 -0
  264. package/dist/extra/ops/fai_drill.d.ts +51 -0
  265. package/dist/extra/ops/fai_drill.d.ts.map +1 -0
  266. package/dist/extra/ops/fai_drill.js +233 -0
  267. package/dist/extra/ops/fai_drill.js.map +1 -0
  268. package/dist/extra/ops/fai_extrude.d.ts +36 -0
  269. package/dist/extra/ops/fai_extrude.d.ts.map +1 -0
  270. package/dist/extra/ops/fai_extrude.js +84 -0
  271. package/dist/extra/ops/fai_extrude.js.map +1 -0
  272. package/dist/extra/ops/fai_split.d.ts +46 -0
  273. package/dist/extra/ops/fai_split.d.ts.map +1 -0
  274. package/dist/extra/ops/fai_split.js +235 -0
  275. package/dist/extra/ops/fai_split.js.map +1 -0
  276. package/dist/extra/ops/load.d.ts +49 -0
  277. package/dist/extra/ops/load.d.ts.map +1 -0
  278. package/dist/extra/ops/load.js +423 -0
  279. package/dist/extra/ops/load.js.map +1 -0
  280. package/dist/extra/ops/svg-extrude.d.ts +32 -0
  281. package/dist/extra/ops/svg-extrude.d.ts.map +1 -0
  282. package/dist/extra/ops/svg-extrude.js +74 -0
  283. package/dist/extra/ops/svg-extrude.js.map +1 -0
  284. package/dist/extra/ops/text.d.ts +34 -0
  285. package/dist/extra/ops/text.d.ts.map +1 -0
  286. package/dist/extra/ops/text.js +100 -0
  287. package/dist/extra/ops/text.js.map +1 -0
  288. package/dist/geometry2d/bridge/lift-on-plane.d.ts +8 -5
  289. package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -1
  290. package/dist/geometry2d/bridge/lift-on-plane.js +8 -5
  291. package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -1
  292. package/dist/index.d.ts +6 -2
  293. package/dist/index.d.ts.map +1 -1
  294. package/dist/index.js +8 -2
  295. package/dist/index.js.map +1 -1
  296. package/dist/lang/symbol-table.d.ts +3 -3
  297. package/dist/lang/symbol-table.generated.d.ts +10 -0
  298. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  299. package/dist/lang/symbol-table.generated.js +10 -0
  300. package/dist/lang/symbol-table.generated.js.map +1 -1
  301. package/dist/lang/symbol-table.js +3 -3
  302. package/dist/lang/symbol-table.js.map +1 -1
  303. package/dist/math3d/index.d.ts +1 -1
  304. package/dist/math3d/index.js +1 -1
  305. package/dist/math3d/index.js.map +1 -1
  306. package/dist/mesh/engrave.d.ts +2 -3
  307. package/dist/mesh/engrave.d.ts.map +1 -1
  308. package/dist/mesh/engrave.js +4 -11
  309. package/dist/mesh/engrave.js.map +1 -1
  310. package/dist/mesh/index.d.ts +0 -2
  311. package/dist/mesh/index.d.ts.map +1 -1
  312. package/dist/mesh/index.js +0 -2
  313. package/dist/mesh/index.js.map +1 -1
  314. package/dist/mesh/primitives.d.ts +7 -5
  315. package/dist/mesh/primitives.d.ts.map +1 -1
  316. package/dist/mesh/primitives.js +16 -9
  317. package/dist/mesh/primitives.js.map +1 -1
  318. package/dist/mesh/types.d.ts +4 -3
  319. package/dist/mesh/types.d.ts.map +1 -1
  320. package/dist/mesh/types.js.map +1 -1
  321. package/dist/node-host/cli.d.ts +11 -4
  322. package/dist/node-host/cli.d.ts.map +1 -1
  323. package/dist/node-host/cli.js +53 -28
  324. package/dist/node-host/cli.js.map +1 -1
  325. package/dist/node-host/execute-script.d.ts.map +1 -1
  326. package/dist/node-host/execute-script.js +3 -4
  327. package/dist/node-host/execute-script.js.map +1 -1
  328. package/dist/node-host/lib-package-json.d.ts +36 -0
  329. package/dist/node-host/lib-package-json.d.ts.map +1 -0
  330. package/dist/node-host/lib-package-json.js +73 -0
  331. package/dist/node-host/lib-package-json.js.map +1 -0
  332. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  333. package/dist/occt-kernel/occt-primitives.js +41 -0
  334. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  335. package/dist/occt-kernel/occtKernel.d.ts +1 -1
  336. package/dist/occt-kernel/occtKernel.js +1 -1
  337. package/dist/occt-kernel/occtKernel.js.map +1 -1
  338. package/dist/primitives/brep-primitives.d.ts.map +1 -1
  339. package/dist/primitives/brep-primitives.js +39 -12
  340. package/dist/primitives/brep-primitives.js.map +1 -1
  341. package/dist/runtime-state.d.ts +28 -1
  342. package/dist/runtime-state.d.ts.map +1 -1
  343. package/dist/runtime-state.js +14 -1
  344. package/dist/runtime-state.js.map +1 -1
  345. package/dist/sdk.d.ts +2 -2
  346. package/dist/sdk.d.ts.map +1 -1
  347. package/dist/sdk.js +11 -2
  348. package/dist/sdk.js.map +1 -1
  349. package/dist/sketch/bspline.d.ts +58 -0
  350. package/dist/sketch/bspline.d.ts.map +1 -0
  351. package/dist/sketch/bspline.js +104 -0
  352. package/dist/sketch/bspline.js.map +1 -0
  353. package/dist/sketch/canonical.d.ts +239 -0
  354. package/dist/sketch/canonical.d.ts.map +1 -0
  355. package/dist/sketch/canonical.js +17 -0
  356. package/dist/sketch/canonical.js.map +1 -0
  357. package/dist/sketch/contour.d.ts +43 -0
  358. package/dist/sketch/contour.d.ts.map +1 -0
  359. package/dist/sketch/contour.js +202 -0
  360. package/dist/sketch/contour.js.map +1 -0
  361. package/dist/sketch/dim-spec.d.ts +32 -0
  362. package/dist/sketch/dim-spec.d.ts.map +1 -0
  363. package/dist/sketch/dim-spec.js +112 -0
  364. package/dist/sketch/dim-spec.js.map +1 -0
  365. package/dist/sketch/faces.d.ts +45 -0
  366. package/dist/sketch/faces.d.ts.map +1 -0
  367. package/dist/sketch/faces.js +108 -0
  368. package/dist/sketch/faces.js.map +1 -0
  369. package/dist/sketch/fcstd-types.d.ts +194 -0
  370. package/dist/sketch/fcstd-types.d.ts.map +1 -0
  371. package/dist/sketch/fcstd-types.js +67 -0
  372. package/dist/sketch/fcstd-types.js.map +1 -0
  373. package/dist/sketch/index.d.ts +46 -0
  374. package/dist/sketch/index.d.ts.map +1 -0
  375. package/dist/sketch/index.js +39 -0
  376. package/dist/sketch/index.js.map +1 -0
  377. package/dist/sketch/node.d.ts +14 -0
  378. package/dist/sketch/node.d.ts.map +1 -0
  379. package/dist/sketch/node.js +43 -0
  380. package/dist/sketch/node.js.map +1 -0
  381. package/dist/sketch/op.d.ts +111 -0
  382. package/dist/sketch/op.d.ts.map +1 -0
  383. package/dist/sketch/op.js +185 -0
  384. package/dist/sketch/op.js.map +1 -0
  385. package/dist/sketch/planegcs-backend.d.ts +69 -0
  386. package/dist/sketch/planegcs-backend.d.ts.map +1 -0
  387. package/dist/sketch/planegcs-backend.js +812 -0
  388. package/dist/sketch/planegcs-backend.js.map +1 -0
  389. package/dist/sketch/project.d.ts +176 -0
  390. package/dist/sketch/project.d.ts.map +1 -0
  391. package/dist/sketch/project.js +656 -0
  392. package/dist/sketch/project.js.map +1 -0
  393. package/dist/sketch/shapes.d.ts +370 -0
  394. package/dist/sketch/shapes.d.ts.map +1 -0
  395. package/dist/sketch/shapes.js +959 -0
  396. package/dist/sketch/shapes.js.map +1 -0
  397. package/dist/sketch/solve.d.ts +21 -0
  398. package/dist/sketch/solve.d.ts.map +1 -0
  399. package/dist/sketch/solve.js +144 -0
  400. package/dist/sketch/solve.js.map +1 -0
  401. package/dist/sketch/solver-loader.d.ts +47 -0
  402. package/dist/sketch/solver-loader.d.ts.map +1 -0
  403. package/dist/sketch/solver-loader.js +77 -0
  404. package/dist/sketch/solver-loader.js.map +1 -0
  405. package/dist/sketch/solver.d.ts +63 -0
  406. package/dist/sketch/solver.d.ts.map +1 -0
  407. package/dist/sketch/solver.js +28 -0
  408. package/dist/sketch/solver.js.map +1 -0
  409. package/dist/sketch/verify.d.ts +53 -0
  410. package/dist/sketch/verify.d.ts.map +1 -0
  411. package/dist/sketch/verify.js +71 -0
  412. package/dist/sketch/verify.js.map +1 -0
  413. package/dist/topology/naming/geom-hint.d.ts +12 -0
  414. package/dist/topology/naming/geom-hint.d.ts.map +1 -1
  415. package/dist/topology/naming/geom-hint.js +1 -1
  416. package/dist/topology/naming/geom-hint.js.map +1 -1
  417. package/dist/topology/naming/lineage.d.ts +1 -0
  418. package/dist/topology/naming/lineage.d.ts.map +1 -1
  419. package/dist/topology/naming/lineage.js +37 -1
  420. package/dist/topology/naming/lineage.js.map +1 -1
  421. package/dist/topology/naming/resolve-face.d.ts +13 -2
  422. package/dist/topology/naming/resolve-face.d.ts.map +1 -1
  423. package/dist/topology/naming/resolve-face.js +18 -2
  424. package/dist/topology/naming/resolve-face.js.map +1 -1
  425. package/dist/weapp.d.ts +1 -1
  426. package/dist/weapp.d.ts.map +1 -1
  427. package/dist/weapp.js +1 -1
  428. package/dist/weapp.js.map +1 -1
  429. package/package.json +43 -11
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @faicad/faijs/extra/browser — browser/worker entry for the extra domain.
3
+ *
4
+ * This entry is environment-agnostic (no `node:*` modules). It re-exports the
5
+ * main extra entry verbatim; it exists so hosts can import the extra domain
6
+ * the same way they import `@faicad/faijs/browser`.
7
+ */
8
+ export * from './index.js';
9
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/extra/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,cAAc,SAAS,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @faicad/faijs/extra/browser — browser/worker entry for the extra domain.
3
+ *
4
+ * This entry is environment-agnostic (no `node:*` modules). It re-exports the
5
+ * main extra entry verbatim; it exists so hosts can import the extra domain
6
+ * the same way they import `@faicad/faijs/browser`.
7
+ */
8
+ export * from './index.js';
9
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/extra/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,cAAc,SAAS,CAAA","sourcesContent":["/**\n * @faicad/faijs/extra/browser — browser/worker entry for the extra domain.\n *\n * This entry is environment-agnostic (no `node:*` modules). It re-exports the\n * main extra entry verbatim; it exists so hosts can import the extra domain\n * the same way they import `@faicad/faijs/browser`.\n */\nexport * from './index'\n"]}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @faicad/faijs/extra/editor-ops — lightweight editor op closure.
3
+ *
4
+ * Carries the A group editor ops (`fai_drill` / `fai_extrude` / `fai_split`,
5
+ * `group` / `assembly`, `copy`, `load`) without the heavy text/SVG geometry
6
+ * chain (opentype.js, etc.). The cad namespace is now fully assembled inside
7
+ * `createApiNamespace()`, so this entry no longer exposes merge/register
8
+ * functions — it only re-exports the ops for bundle consumers that need the
9
+ * lightweight closure (e.g. the weapp worker).
10
+ *
11
+ * The cad namespace is identical on all platforms; only the implementation
12
+ * closure differs.
13
+ */
14
+ export { EDITOR_OPS } from './op-names.js';
15
+ export { fai_drill } from './ops/fai_drill.js';
16
+ export { fai_extrude } from './ops/fai_extrude.js';
17
+ export { fai_split } from './ops/fai_split.js';
18
+ export { group, assembly } from './ops/compound.js';
19
+ export type { GroupParams, AssemblyParams, AssemblyBehavior } from './ops/compound.js';
20
+ export { copy } from './ops/copy.js';
21
+ export { load } from './ops/load.js';
22
+ //# sourceMappingURL=editor-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-ops.d.ts","sourceRoot":"","sources":["../../src/extra/editor-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAChD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACnF,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @faicad/faijs/extra/editor-ops — lightweight editor op closure.
3
+ *
4
+ * Carries the A group editor ops (`fai_drill` / `fai_extrude` / `fai_split`,
5
+ * `group` / `assembly`, `copy`, `load`) without the heavy text/SVG geometry
6
+ * chain (opentype.js, etc.). The cad namespace is now fully assembled inside
7
+ * `createApiNamespace()`, so this entry no longer exposes merge/register
8
+ * functions — it only re-exports the ops for bundle consumers that need the
9
+ * lightweight closure (e.g. the weapp worker).
10
+ *
11
+ * The cad namespace is identical on all platforms; only the implementation
12
+ * closure differs.
13
+ */
14
+ export { EDITOR_OPS } from './op-names.js';
15
+ export { fai_drill } from './ops/fai_drill.js';
16
+ export { fai_extrude } from './ops/fai_extrude.js';
17
+ export { fai_split } from './ops/fai_split.js';
18
+ export { group, assembly } from './ops/compound.js';
19
+ export { copy } from './ops/copy.js';
20
+ export { load } from './ops/load.js';
21
+ //# sourceMappingURL=editor-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-ops.js","sourceRoot":"","sources":["../../src/extra/editor-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA","sourcesContent":["/**\n * @faicad/faijs/extra/editor-ops — lightweight editor op closure.\n *\n * Carries the A group editor ops (`fai_drill` / `fai_extrude` / `fai_split`,\n * `group` / `assembly`, `copy`, `load`) without the heavy text/SVG geometry\n * chain (opentype.js, etc.). The cad namespace is now fully assembled inside\n * `createApiNamespace()`, so this entry no longer exposes merge/register\n * functions — it only re-exports the ops for bundle consumers that need the\n * lightweight closure (e.g. the weapp worker).\n *\n * The cad namespace is identical on all platforms; only the implementation\n * closure differs.\n */\nexport { EDITOR_OPS } from './op-names'\nexport { fai_drill } from './ops/fai_drill'\nexport { fai_extrude } from './ops/fai_extrude'\nexport { fai_split } from './ops/fai_split'\nexport { group, assembly } from './ops/compound'\nexport type { GroupParams, AssemblyParams, AssemblyBehavior } from './ops/compound'\nexport { copy } from './ops/copy'\nexport { load } from './ops/load'\n"]}
@@ -0,0 +1,45 @@
1
+ import type { Contour } from '../../mesh/meshdata/extrude.js';
2
+ import type { Shape } from '../../mesh/types.js';
3
+ /**
4
+ * Options controlling an SVG extrusion.
5
+ *
6
+ * targetLongSide maps the longer logical side of the SVG to this length in
7
+ * mm (the short side is scaled proportionally); naturalWidth/naturalHeight
8
+ * are the SVG's logical dimensions used to compute the scale factor.
9
+ */
10
+ export interface SvgExtrudeOptions {
11
+ depth: number;
12
+ /** 长边目标长度(mm),短边按比例计算。默认 20 */
13
+ targetLongSide?: number;
14
+ /** SVG 原始逻辑尺寸,用于计算实际缩放比例 */
15
+ naturalWidth: number;
16
+ naturalHeight: number;
17
+ }
18
+ /**
19
+ * Parse SVG text into a list of closed Y-up contours.
20
+ * Uses the shared SVG syntax layer (element extraction + path flattening +
21
+ * group matrix + evenodd hole classification).
22
+ *
23
+ * @param svgText - the SVG source text.
24
+ * @returns the list of closed contours found in the SVG.
25
+ * @throws when the SVG contains no closed contour.
26
+ */
27
+ export declare function parseSvgShapes(svgText: string): Contour[];
28
+ /**
29
+ * Extrude a list of contours into a single Shape.
30
+ * The scale factor is computed from naturalWidth/naturalHeight and targetLongSide.
31
+ *
32
+ * @param shapes - the contours to extrude.
33
+ * @param options - the extrusion options (depth and scale inputs).
34
+ * @returns the merged, scaled, centred Shape.
35
+ */
36
+ export declare function extrudeShapes(shapes: Contour[], options: SvgExtrudeOptions): Shape;
37
+ /**
38
+ * One-stop helper: SVG text → extruded Shape.
39
+ *
40
+ * @param svgText - the SVG source text.
41
+ * @param options - the extrusion options.
42
+ * @returns the extruded Shape.
43
+ */
44
+ export declare function svgToExtrudedGeometry(svgText: string, options: SvgExtrudeOptions): Shape;
45
+ //# sourceMappingURL=svg-extrude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-extrude.d.ts","sourceRoot":"","sources":["../../../src/extra/extras/svg-extrude.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAE7C;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CAezD;AA2BD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,OAAO,EAAE,EACjB,OAAO,EAAE,iBAAiB,GACzB,KAAK,CAmBP;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,GACzB,KAAK,CAGP"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * svg-extrude — SVG → 拉伸几何(editor extension library,three-free)。
3
+ *
4
+ * 几何链:SVG 文本 → Contour[](共享 SVG 语法层折线化 + group matrix +
5
+ * Y 翻转 + evenodd 分类,`@faicad/faijs/primitives/svg/svg-path`)→
6
+ * `extrudeShape`(core 自有)→ 缩放 → 居中。返回 core `Shape`。
7
+ *
8
+ * 与旧 three `SVGLoader` 实现的登记差异:
9
+ * - fill-rule:统一按 evenodd 分类孔洞(SVGLoader 支持 per-path fill-rule,
10
+ * 本项目素材均为 potrace/Inkscape 导出,evenodd 语义足够,见方案 R6);
11
+ * - transform:支持 `<g transform="matrix(...)">` 与 rect 内联 transform
12
+ * (SVGLoader 亦支持;本项目共享层覆盖相同面);
13
+ * - 曲线:Bezier/Arc 按 `curveSegments` 采样折线化(SVGLoader 用精确曲线,
14
+ * 预览级网格两者等价,几何级差异登记于方案 R2)。
15
+ */
16
+ import { svgPathToContours } from '../../primitives/svg/svg-path.js';
17
+ import { extrudeShape } from '../../mesh/meshdata/extrude.js';
18
+ /**
19
+ * Parse SVG text into a list of closed Y-up contours.
20
+ * Uses the shared SVG syntax layer (element extraction + path flattening +
21
+ * group matrix + evenodd hole classification).
22
+ *
23
+ * @param svgText - the SVG source text.
24
+ * @returns the list of closed contours found in the SVG.
25
+ * @throws when the SVG contains no closed contour.
26
+ */
27
+ export function parseSvgShapes(svgText) {
28
+ let contours;
29
+ try {
30
+ contours = svgPathToContours(svgText, 6);
31
+ }
32
+ catch {
33
+ // svgPathToContours 在「无 path 元素」与「无闭合轮廓」两种情形会各自抛更底层的
34
+ // 错误("[svg-path] No path elements found" / "[svg-path] No closed contours
35
+ // generated")。这里统一成编辑器面向用户的同一句,避免上层按消息文本做分档时
36
+ // 撞上两种措辞(3d_editor 的 svg-extrude.test.ts 也按这一句断言)。
37
+ throw new Error('No closed contour found in SVG. Please check the file content.');
38
+ }
39
+ if (contours.length === 0) {
40
+ throw new Error('No closed contour found in SVG. Please check the file content.');
41
+ }
42
+ return contours;
43
+ }
44
+ /** X/Y 居中、Z 底部对齐到 0(3D 打印放在热床上)。 */
45
+ function centerShapeXYBottom(shape) {
46
+ let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, minZ = Infinity;
47
+ for (let i = 0; i < shape.positions.length; i += 3) {
48
+ const x = shape.positions[i];
49
+ const y = shape.positions[i + 1];
50
+ const z = shape.positions[i + 2];
51
+ if (x < minX)
52
+ minX = x;
53
+ if (x > maxX)
54
+ maxX = x;
55
+ if (y < minY)
56
+ minY = y;
57
+ if (y > maxY)
58
+ maxY = y;
59
+ if (z < minZ)
60
+ minZ = z;
61
+ }
62
+ const dx = -(minX + maxX) / 2;
63
+ const dy = -(minY + maxY) / 2;
64
+ const dz = -minZ;
65
+ const positions = new Float32Array(shape.positions.length);
66
+ for (let i = 0; i < shape.positions.length; i += 3) {
67
+ positions[i] = shape.positions[i] + dx;
68
+ positions[i + 1] = shape.positions[i + 1] + dy;
69
+ positions[i + 2] = shape.positions[i + 2] + dz;
70
+ }
71
+ return { ...shape, positions };
72
+ }
73
+ /**
74
+ * Extrude a list of contours into a single Shape.
75
+ * The scale factor is computed from naturalWidth/naturalHeight and targetLongSide.
76
+ *
77
+ * @param shapes - the contours to extrude.
78
+ * @param options - the extrusion options (depth and scale inputs).
79
+ * @returns the merged, scaled, centred Shape.
80
+ */
81
+ export function extrudeShapes(shapes, options) {
82
+ const { depth, naturalWidth, naturalHeight, targetLongSide = 20 } = options;
83
+ // 计算缩放比例:长边映射到 targetLongSide
84
+ const longSide = Math.max(naturalWidth, naturalHeight);
85
+ const scale = longSide > 0 ? targetLongSide / longSide : 1;
86
+ // 先挤出,再整体缩放几何体(XY 缩放,Z 不变)
87
+ const shape = extrudeShape(shapes, depth);
88
+ if (scale !== 1) {
89
+ const positions = new Float32Array(shape.positions.length);
90
+ for (let i = 0; i < shape.positions.length; i += 3) {
91
+ positions[i] = shape.positions[i] * scale;
92
+ positions[i + 1] = shape.positions[i + 1] * scale;
93
+ positions[i + 2] = shape.positions[i + 2];
94
+ }
95
+ return centerShapeXYBottom({ ...shape, positions });
96
+ }
97
+ return centerShapeXYBottom(shape);
98
+ }
99
+ /**
100
+ * One-stop helper: SVG text → extruded Shape.
101
+ *
102
+ * @param svgText - the SVG source text.
103
+ * @param options - the extrusion options.
104
+ * @returns the extruded Shape.
105
+ */
106
+ export function svgToExtrudedGeometry(svgText, options) {
107
+ const shapes = parseSvgShapes(svgText);
108
+ return extrudeShapes(shapes, options);
109
+ }
110
+ //# sourceMappingURL=svg-extrude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-extrude.js","sourceRoot":"","sources":["../../../src/extra/extras/svg-extrude.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * svg-extrude — SVG → 拉伸几何(editor extension library,three-free)。\n *\n * 几何链:SVG 文本 → Contour[](共享 SVG 语法层折线化 + group matrix +\n * Y 翻转 + evenodd 分类,`@faicad/faijs/primitives/svg/svg-path`)→\n * `extrudeShape`(core 自有)→ 缩放 → 居中。返回 core `Shape`。\n *\n * 与旧 three `SVGLoader` 实现的登记差异:\n * - fill-rule:统一按 evenodd 分类孔洞(SVGLoader 支持 per-path fill-rule,\n * 本项目素材均为 potrace/Inkscape 导出,evenodd 语义足够,见方案 R6);\n * - transform:支持 `<g transform=\"matrix(...)\">` 与 rect 内联 transform\n * (SVGLoader 亦支持;本项目共享层覆盖相同面);\n * - 曲线:Bezier/Arc 按 `curveSegments` 采样折线化(SVGLoader 用精确曲线,\n * 预览级网格两者等价,几何级差异登记于方案 R2)。\n */\nimport { svgPathToContours } from '../../primitives/svg/svg-path'\nimport { extrudeShape } from '../../mesh/meshdata/extrude'\nimport type { Contour } from '../../mesh/meshdata/extrude'\nimport type { Shape } from '../../mesh/types'\n\n/**\n * Options controlling an SVG extrusion.\n *\n * targetLongSide maps the longer logical side of the SVG to this length in\n * mm (the short side is scaled proportionally); naturalWidth/naturalHeight\n * are the SVG's logical dimensions used to compute the scale factor.\n */\nexport interface SvgExtrudeOptions {\n depth: number\n /** 长边目标长度(mm),短边按比例计算。默认 20 */\n targetLongSide?: number\n /** SVG 原始逻辑尺寸,用于计算实际缩放比例 */\n naturalWidth: number\n naturalHeight: number\n}\n\n/**\n * Parse SVG text into a list of closed Y-up contours.\n * Uses the shared SVG syntax layer (element extraction + path flattening +\n * group matrix + evenodd hole classification).\n *\n * @param svgText - the SVG source text.\n * @returns the list of closed contours found in the SVG.\n * @throws when the SVG contains no closed contour.\n */\nexport function parseSvgShapes(svgText: string): Contour[] {\n let contours: Contour[]\n try {\n contours = svgPathToContours(svgText, 6)\n } catch {\n // svgPathToContours 在「无 path 元素」与「无闭合轮廓」两种情形会各自抛更底层的\n // 错误(\"[svg-path] No path elements found\" / \"[svg-path] No closed contours\n // generated\")。这里统一成编辑器面向用户的同一句,避免上层按消息文本做分档时\n // 撞上两种措辞(3d_editor 的 svg-extrude.test.ts 也按这一句断言)。\n throw new Error('No closed contour found in SVG. Please check the file content.')\n }\n if (contours.length === 0) {\n throw new Error('No closed contour found in SVG. Please check the file content.')\n }\n return contours\n}\n\n/** X/Y 居中、Z 底部对齐到 0(3D 打印放在热床上)。 */\nfunction centerShapeXYBottom(shape: Shape): Shape {\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, minZ = Infinity\n for (let i = 0; i < shape.positions.length; i += 3) {\n const x = shape.positions[i]\n const y = shape.positions[i + 1]\n const z = shape.positions[i + 2]\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n if (z < minZ) minZ = z\n }\n const dx = -(minX + maxX) / 2\n const dy = -(minY + maxY) / 2\n const dz = -minZ\n const positions = new Float32Array(shape.positions.length)\n for (let i = 0; i < shape.positions.length; i += 3) {\n positions[i] = shape.positions[i] + dx\n positions[i + 1] = shape.positions[i + 1] + dy\n positions[i + 2] = shape.positions[i + 2] + dz\n }\n return { ...shape, positions }\n}\n\n/**\n * Extrude a list of contours into a single Shape.\n * The scale factor is computed from naturalWidth/naturalHeight and targetLongSide.\n *\n * @param shapes - the contours to extrude.\n * @param options - the extrusion options (depth and scale inputs).\n * @returns the merged, scaled, centred Shape.\n */\nexport function extrudeShapes(\n shapes: Contour[],\n options: SvgExtrudeOptions,\n): Shape {\n const { depth, naturalWidth, naturalHeight, targetLongSide = 20 } = options\n\n // 计算缩放比例:长边映射到 targetLongSide\n const longSide = Math.max(naturalWidth, naturalHeight)\n const scale = longSide > 0 ? targetLongSide / longSide : 1\n\n // 先挤出,再整体缩放几何体(XY 缩放,Z 不变)\n const shape = extrudeShape(shapes, depth)\n if (scale !== 1) {\n const positions = new Float32Array(shape.positions.length)\n for (let i = 0; i < shape.positions.length; i += 3) {\n positions[i] = shape.positions[i] * scale\n positions[i + 1] = shape.positions[i + 1] * scale\n positions[i + 2] = shape.positions[i + 2]\n }\n return centerShapeXYBottom({ ...shape, positions })\n }\n return centerShapeXYBottom(shape)\n}\n\n/**\n * One-stop helper: SVG text → extruded Shape.\n *\n * @param svgText - the SVG source text.\n * @param options - the extrusion options.\n * @returns the extruded Shape.\n */\nexport function svgToExtrudedGeometry(\n svgText: string,\n options: SvgExtrudeOptions,\n): Shape {\n const shapes = parseSvgShapes(svgText)\n return extrudeShapes(shapes, options)\n}\n"]}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * text-cjk — mixed CJK + Latin text geometry (editor extension library).
3
+ *
4
+ * Uses the Local Font Access API (window.queryLocalFonts) to load system CJK
5
+ * fonts, then parses glyph paths with opentype.js to create Contour[] →
6
+ * extrudeShape (core, three-free).
7
+ *
8
+ * When a CJK font is available, it is used for ALL characters (including Latin).
9
+ * When no CJK font is available, the default OpenSans Regular font (from
10
+ * fontRegistry) is used for all characters via opentype.js.
11
+ *
12
+ * The character classification / system-font loading half lives in core
13
+ * (`@faicad/faijs/primitives/text/cjk-font`) and is deliberately three-free.
14
+ */
15
+ import type { Font } from 'opentype.js';
16
+ import type { Shape } from '../../mesh/types.js';
17
+ /**
18
+ * Generate geometry for mixed text (CJK + Latin).
19
+ *
20
+ * When cjkFont is available, it is used for ALL characters (including Latin),
21
+ * since CJK fonts typically contain Latin glyphs.
22
+ *
23
+ * When cjkFont is null, the default OpenSans Regular font (from fontRegistry)
24
+ * is used for all characters via opentype.js — this is the same font used by
25
+ * the BREP path, ensuring glyph consistency.
26
+ *
27
+ * @param text Text string to render
28
+ * @param size Font size in mm
29
+ * @param depth Extrusion depth in mm
30
+ * @param cjkFont CJK font from system (null = use default font only)
31
+ * @param defaultFont Default opentype.js Font (OpenSans Regular from fontRegistry).
32
+ * If not provided, will be loaded via getOpentypeFont().
33
+ * @returns a promise resolving to the merged, centred shape for the whole text.
34
+ */
35
+ export declare function createMixedTextGeometry(text: string, size: number, depth: number, cjkFont: Font | null, defaultFont?: Font): Promise<Shape>;
36
+ //# sourceMappingURL=text-cjk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-cjk.d.ts","sourceRoot":"","sources":["../../../src/extra/extras/text-cjk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAGvC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AA0B7C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,IAAI,GAAG,IAAI,EACpB,WAAW,CAAC,EAAE,IAAI,GACjB,OAAO,CAAC,KAAK,CAAC,CAiDhB"}
@@ -0,0 +1,86 @@
1
+ import { extrudeShape } from '../../mesh/meshdata/extrude.js';
2
+ import { mergeShapes } from '../../mesh/meshdata/ops.js';
3
+ import { getOpentypeFont, opentypePathToContours, centerShapeXZBottom } from './text-geometry.js';
4
+ /**
5
+ * Generate geometry for a single character using opentype.js.
6
+ * Uses the same shape/extrude chain as opentypePathToGeometry().
7
+ */
8
+ function charShape(char, size, depth, font, xOffset) {
9
+ const glyph = font.charToGlyph(char);
10
+ if (!glyph || !glyph.path)
11
+ return null;
12
+ const path = glyph.getPath(xOffset, 0, size);
13
+ if (!path || !path.commands || path.commands.length === 0)
14
+ return null;
15
+ const contours = opentypePathToContours(path, 6);
16
+ if (contours.length === 0)
17
+ return null;
18
+ // 不居中:逐字符的 xOffset 布局在此处处理
19
+ return extrudeShape(contours, depth);
20
+ }
21
+ /**
22
+ * Generate geometry for mixed text (CJK + Latin).
23
+ *
24
+ * When cjkFont is available, it is used for ALL characters (including Latin),
25
+ * since CJK fonts typically contain Latin glyphs.
26
+ *
27
+ * When cjkFont is null, the default OpenSans Regular font (from fontRegistry)
28
+ * is used for all characters via opentype.js — this is the same font used by
29
+ * the BREP path, ensuring glyph consistency.
30
+ *
31
+ * @param text Text string to render
32
+ * @param size Font size in mm
33
+ * @param depth Extrusion depth in mm
34
+ * @param cjkFont CJK font from system (null = use default font only)
35
+ * @param defaultFont Default opentype.js Font (OpenSans Regular from fontRegistry).
36
+ * If not provided, will be loaded via getOpentypeFont().
37
+ * @returns a promise resolving to the merged, centred shape for the whole text.
38
+ */
39
+ export async function createMixedTextGeometry(text, size, depth, cjkFont, defaultFont) {
40
+ // Use CJK font for all chars if available, otherwise use default font
41
+ const font = cjkFont ?? defaultFont ?? (await getOpentypeFont());
42
+ // All characters individually
43
+ const charShapes = [];
44
+ let cursorX = 0;
45
+ for (const char of text) {
46
+ if (char === ' ' || char === '\t' || char === '\n' || char === '\r') {
47
+ // Space: advance by approximate width
48
+ const spaceAdv = font.charToGlyph(' ').advanceWidth ?? size / 3;
49
+ cursorX += spaceAdv * (size / font.unitsPerEm);
50
+ continue;
51
+ }
52
+ const glyph = font.charToGlyph(char);
53
+ if (glyph.index === 0) {
54
+ // Skip notdef glyphs (should not happen if font check was done upstream)
55
+ continue;
56
+ }
57
+ const shape = charShape(char, size, depth, font, cursorX);
58
+ if (shape) {
59
+ let minX = Infinity, maxX = -Infinity;
60
+ for (let i = 0; i < shape.positions.length; i += 3) {
61
+ const x = shape.positions[i];
62
+ if (x < minX)
63
+ minX = x;
64
+ if (x > maxX)
65
+ maxX = x;
66
+ }
67
+ const charWidth = maxX - minX;
68
+ const adv = (glyph.advanceWidth ?? 0) * (size / font.unitsPerEm);
69
+ // Use advance width for cursor, but ensure minimum advance
70
+ const effectiveAdv = adv > 0 ? adv : charWidth + size * 0.1;
71
+ charShapes.push({ shape, advance: effectiveAdv });
72
+ cursorX += effectiveAdv;
73
+ }
74
+ }
75
+ // Merge all character geometries into one
76
+ if (charShapes.length === 0) {
77
+ // Fallback: create a minimal geometry from a question mark
78
+ const shape = charShape('?', size, depth, font, 0);
79
+ if (shape)
80
+ return centerShapeXZBottom(shape);
81
+ return { positions: new Float32Array(0), indices: new Uint32Array(0) };
82
+ }
83
+ const merged = mergeShapes(charShapes.map((cs) => cs.shape));
84
+ return centerShapeXZBottom(merged);
85
+ }
86
+ //# sourceMappingURL=text-cjk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-cjk.js","sourceRoot":"","sources":["../../../src/extra/extras/text-cjk.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * text-cjk — mixed CJK + Latin text geometry (editor extension library).\n *\n * Uses the Local Font Access API (window.queryLocalFonts) to load system CJK\n * fonts, then parses glyph paths with opentype.js to create Contour[] →\n * extrudeShape (core, three-free).\n *\n * When a CJK font is available, it is used for ALL characters (including Latin).\n * When no CJK font is available, the default OpenSans Regular font (from\n * fontRegistry) is used for all characters via opentype.js.\n *\n * The character classification / system-font loading half lives in core\n * (`@faicad/faijs/primitives/text/cjk-font`) and is deliberately three-free.\n */\nimport type { Font } from 'opentype.js'\nimport { extrudeShape } from '../../mesh/meshdata/extrude'\nimport { mergeShapes } from '../../mesh/meshdata/ops'\nimport type { Shape } from '../../mesh/types'\nimport { getOpentypeFont, opentypePathToContours, centerShapeXZBottom } from './text-geometry'\n\n/**\n * Generate geometry for a single character using opentype.js.\n * Uses the same shape/extrude chain as opentypePathToGeometry().\n */\nfunction charShape(\n char: string,\n size: number,\n depth: number,\n font: Font,\n xOffset: number,\n): Shape | null {\n const glyph = font.charToGlyph(char)\n if (!glyph || !glyph.path) return null\n\n const path = glyph.getPath(xOffset, 0, size)\n if (!path || !path.commands || path.commands.length === 0) return null\n\n const contours = opentypePathToContours(path, 6)\n if (contours.length === 0) return null\n // 不居中:逐字符的 xOffset 布局在此处处理\n return extrudeShape(contours, depth)\n}\n\n/**\n * Generate geometry for mixed text (CJK + Latin).\n *\n * When cjkFont is available, it is used for ALL characters (including Latin),\n * since CJK fonts typically contain Latin glyphs.\n *\n * When cjkFont is null, the default OpenSans Regular font (from fontRegistry)\n * is used for all characters via opentype.js — this is the same font used by\n * the BREP path, ensuring glyph consistency.\n *\n * @param text Text string to render\n * @param size Font size in mm\n * @param depth Extrusion depth in mm\n * @param cjkFont CJK font from system (null = use default font only)\n * @param defaultFont Default opentype.js Font (OpenSans Regular from fontRegistry).\n * If not provided, will be loaded via getOpentypeFont().\n * @returns a promise resolving to the merged, centred shape for the whole text.\n */\nexport async function createMixedTextGeometry(\n text: string,\n size: number,\n depth: number,\n cjkFont: Font | null,\n defaultFont?: Font,\n): Promise<Shape> {\n // Use CJK font for all chars if available, otherwise use default font\n const font = cjkFont ?? defaultFont ?? (await getOpentypeFont())\n\n // All characters individually\n const charShapes: { shape: Shape; advance: number }[] = []\n let cursorX = 0\n\n for (const char of text) {\n if (char === ' ' || char === '\\t' || char === '\\n' || char === '\\r') {\n // Space: advance by approximate width\n const spaceAdv = font.charToGlyph(' ').advanceWidth ?? size / 3\n cursorX += spaceAdv * (size / font.unitsPerEm)\n continue\n }\n\n const glyph = font.charToGlyph(char)\n if (glyph.index === 0) {\n // Skip notdef glyphs (should not happen if font check was done upstream)\n continue\n }\n\n const shape = charShape(char, size, depth, font, cursorX)\n if (shape) {\n let minX = Infinity, maxX = -Infinity\n for (let i = 0; i < shape.positions.length; i += 3) {\n const x = shape.positions[i]\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n }\n const charWidth = maxX - minX\n const adv = (glyph.advanceWidth ?? 0) * (size / font.unitsPerEm)\n // Use advance width for cursor, but ensure minimum advance\n const effectiveAdv = adv > 0 ? adv : charWidth + size * 0.1\n charShapes.push({ shape, advance: effectiveAdv })\n cursorX += effectiveAdv\n }\n }\n\n // Merge all character geometries into one\n if (charShapes.length === 0) {\n // Fallback: create a minimal geometry from a question mark\n const shape = charShape('?', size, depth, font, 0)\n if (shape) return centerShapeXZBottom(shape)\n return { positions: new Float32Array(0), indices: new Uint32Array(0) }\n }\n\n const merged = mergeShapes(charShapes.map((cs) => cs.shape))\n return centerShapeXZBottom(merged)\n}\n"]}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * text-geometry — 文字几何创建(mesh 路径)
3
+ *
4
+ * 使用 opentype.js + OpenSans Regular 字体(与 BREP 路径统一)。
5
+ * 字体来源:fontRegistry(通过依赖注入的 FontLoader 加载)。
6
+ *
7
+ * 几何链:opentype Path → Contour[](共享 SVG 语法层折线化 + evenodd 分类,
8
+ * Y-down → Y-up 翻转)→ `extrudeShape`(core 自有,three-free)。
9
+ * 返回 core `Shape`(positions + indices + normals),由使用方自行转为
10
+ * 自己的渲染几何(如 3d_editor 的 BufferGeometry 适配层)。
11
+ */
12
+ import type { Font, Path } from 'opentype.js';
13
+ import type { Contour } from '../../mesh/meshdata/extrude.js';
14
+ import type { Shape } from '../../mesh/types.js';
15
+ /**
16
+ * Get the default opentype.js font (OpenSans Regular).
17
+ *
18
+ * Fetched from fontRegistry — the same font used by the BREP path
19
+ * (text-to-solid). The first call triggers a lazy ensureDefaultFont() load.
20
+ *
21
+ * @returns a promise resolving to the default opentype.js Font.
22
+ */
23
+ export declare function getOpentypeFont(): Promise<Font>;
24
+ /**
25
+ * 将 opentype.js Path 折线化并分类为 Y-up 平面轮廓(供 `extrudeShape` 消费)。
26
+ *
27
+ * opentype 字形坐标是 Y-down(canvas 惯例),与 SVG 一致;输出翻转至 Y-up,
28
+ * 与 BREP 文本路径(`core/brep/text/text-to-solid.ts`)的世界坐标约定一致。
29
+ *
30
+ * @param path - the opentype.js path to flatten.
31
+ * @param curveSegments - per-curve sampling segments (default 6).
32
+ * @returns the classified contours (Y-up).
33
+ */
34
+ export declare function opentypePathToContours(path: Path, curveSegments?: number): Contour[];
35
+ /**
36
+ * X 居中、Y 底部对齐到 0、Z 居中(text 链的旧布局语义)。
37
+ * @param shape - 待居中的 Shape(positions 就地复制,不修改输入)。
38
+ * @returns 平移后的新 Shape(索引/法线不变)。
39
+ */
40
+ export declare function centerShapeXZBottom(shape: Shape): Shape;
41
+ /**
42
+ * Create text geometry centered in X/Z, extruded along +Z.
43
+ *
44
+ * Uses opentype.js font.getPath() → Contour[] → extrudeShape, flipping
45
+ * the opentype y-down axis to y-up. This is the same font source and the same
46
+ * axis convention as the BREP path (text-to-solid), ensuring both glyph and
47
+ * orientation consistency between the mesh and BREP paths.
48
+ *
49
+ * @param text Text string to render
50
+ * @param size Font size in mm
51
+ * @param depth Extrusion depth in mm
52
+ * @param font opentype.js Font object (from fontRegistry)
53
+ * @returns a promise resolving to the extruded text shape.
54
+ */
55
+ export declare function createTextGeometry(text: string, size: number, depth: number, font: Font): Promise<Shape>;
56
+ /**
57
+ * Convert an opentype.js Path to a core Shape.
58
+ *
59
+ * Path commands → Contour[] → extrudeShape. The result is centered in X and Z
60
+ * (bounding box center → origin) with Y aligned to its bottom edge.
61
+ *
62
+ * Exported for reuse by the CJK text path and 3d_editor preview layer.
63
+ *
64
+ * @param path - the opentype.js path to convert.
65
+ * @param depth - extrusion depth in mm.
66
+ * @returns the resulting Shape, or null when the path is empty.
67
+ */
68
+ export declare function opentypePathToGeometry(path: Path, depth: number): Shape | null;
69
+ //# sourceMappingURL=text-geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-geometry.d.ts","sourceRoot":"","sources":["../../../src/extra/extras/text-geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAe,MAAM,aAAa,CAAA;AAS1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAK7C;;;;;;;GAOG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrD;AA0CD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,SAAI,GAAG,OAAO,EAAE,CAoB/E;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAuBvD;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,KAAK,CAAC,CAmBhB;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,GACZ,KAAK,GAAG,IAAI,CAId"}