@faicad/faijs 0.29.5 → 0.30.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (582) hide show
  1. package/NOTICE +6 -5
  2. package/dist/api/api-namespace.d.ts +1 -1
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +53 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/appearance.d.ts +0 -2
  7. package/dist/api/appearance.d.ts.map +1 -1
  8. package/dist/api/appearance.js +0 -2
  9. package/dist/api/appearance.js.map +1 -1
  10. package/dist/api/assembly/entities.d.ts +1 -1
  11. package/dist/api/assembly/entities.js +1 -1
  12. package/dist/api/assembly/entities.js.map +1 -1
  13. package/dist/api/assembly/index.d.ts +1 -1
  14. package/dist/api/assembly/index.js +1 -1
  15. package/dist/api/assembly/index.js.map +1 -1
  16. package/dist/api/assembly/joints.d.ts +33 -15
  17. package/dist/api/assembly/joints.d.ts.map +1 -1
  18. package/dist/api/assembly/joints.js +31 -13
  19. package/dist/api/assembly/joints.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.js +1 -1
  22. package/dist/api/assembly/preview.js.map +1 -1
  23. package/dist/api/assembly/solve.d.ts +1 -1
  24. package/dist/api/assembly/solve.js +1 -1
  25. package/dist/api/assembly/solve.js.map +1 -1
  26. package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.js +1 -1
  28. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  29. package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
  30. package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
  31. package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
  32. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  33. package/dist/api/assembly/solvers/global-solver.js +3 -4
  34. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  35. package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
  36. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
  37. package/dist/api/assembly/solvers/linalg.d.ts +2 -2
  38. package/dist/api/assembly/solvers/linalg.js +2 -2
  39. package/dist/api/assembly/solvers/linalg.js.map +1 -1
  40. package/dist/api/assembly/solvers/types.d.ts +2 -5
  41. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  42. package/dist/api/assembly/solvers/types.js +1 -4
  43. package/dist/api/assembly/solvers/types.js.map +1 -1
  44. package/dist/api/boolean.d.ts.map +1 -1
  45. package/dist/api/boolean.js +7 -6
  46. package/dist/api/boolean.js.map +1 -1
  47. package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
  48. package/dist/api/brep-mirror/booleanFns.js +5 -5
  49. package/dist/api/brep-mirror/booleanFns.js.map +1 -1
  50. package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
  51. package/dist/api/brep-mirror/compoundFns.js +4 -4
  52. package/dist/api/brep-mirror/compoundFns.js.map +1 -1
  53. package/dist/api/brep-mirror/healingFns.d.ts +4 -4
  54. package/dist/api/brep-mirror/healingFns.js +4 -4
  55. package/dist/api/brep-mirror/healingFns.js.map +1 -1
  56. package/dist/api/brep-mirror/hullFns.d.ts +2 -2
  57. package/dist/api/brep-mirror/hullFns.js +2 -2
  58. package/dist/api/brep-mirror/hullFns.js.map +1 -1
  59. package/dist/api/brep-mirror/patternFns.d.ts +5 -5
  60. package/dist/api/brep-mirror/patternFns.js +10 -10
  61. package/dist/api/brep-mirror/patternFns.js.map +1 -1
  62. package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
  63. package/dist/api/brep-mirror/primitiveFns.js +4 -4
  64. package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
  65. package/dist/api/brep-mirror/roofFns.d.ts +3 -3
  66. package/dist/api/brep-mirror/roofFns.js +7 -7
  67. package/dist/api/brep-mirror/roofFns.js.map +1 -1
  68. package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
  69. package/dist/api/brep-mirror/sweepFns.js +14 -14
  70. package/dist/api/brep-mirror/sweepFns.js.map +1 -1
  71. package/dist/api/brep-mirror/threadFns.d.ts +1 -1
  72. package/dist/api/brep-mirror/threadFns.js +1 -1
  73. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  74. package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
  75. package/dist/api/brep-mirror/topologyFns.js +8 -8
  76. package/dist/api/brep-mirror/topologyFns.js.map +1 -1
  77. package/dist/api/brep-operations/booleanFns.d.ts +40 -0
  78. package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
  79. package/dist/api/brep-operations/booleanFns.js +104 -0
  80. package/dist/api/brep-operations/booleanFns.js.map +1 -0
  81. package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
  82. package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
  83. package/dist/api/brep-operations/brepHelpers.js +131 -0
  84. package/dist/api/brep-operations/brepHelpers.js.map +1 -0
  85. package/dist/api/brep-operations/compoundFns.d.ts +46 -0
  86. package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
  87. package/dist/api/brep-operations/compoundFns.js +299 -0
  88. package/dist/api/brep-operations/compoundFns.js.map +1 -0
  89. package/dist/api/brep-operations/healingFns.d.ts +78 -0
  90. package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
  91. package/dist/api/brep-operations/healingFns.js +294 -0
  92. package/dist/api/brep-operations/healingFns.js.map +1 -0
  93. package/dist/api/brep-operations/hullFns.d.ts +20 -0
  94. package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
  95. package/dist/api/brep-operations/hullFns.js +46 -0
  96. package/dist/api/brep-operations/hullFns.js.map +1 -0
  97. package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
  98. package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
  99. package/dist/api/brep-operations/joinery-brep.js +463 -0
  100. package/dist/api/brep-operations/joinery-brep.js.map +1 -0
  101. package/dist/api/brep-operations/patternFns.d.ts +43 -0
  102. package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
  103. package/dist/api/brep-operations/patternFns.js +178 -0
  104. package/dist/api/brep-operations/patternFns.js.map +1 -0
  105. package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
  106. package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
  107. package/dist/api/brep-operations/primitiveFns.js +104 -0
  108. package/dist/api/brep-operations/primitiveFns.js.map +1 -0
  109. package/dist/api/brep-operations/roofFns.d.ts +24 -0
  110. package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
  111. package/dist/api/brep-operations/roofFns.js +229 -0
  112. package/dist/api/brep-operations/roofFns.js.map +1 -0
  113. package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
  114. package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
  115. package/dist/api/brep-operations/straightSkeleton.js +431 -0
  116. package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
  117. package/dist/api/brep-operations/sweepFns.d.ts +60 -0
  118. package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
  119. package/dist/api/brep-operations/sweepFns.js +323 -0
  120. package/dist/api/brep-operations/sweepFns.js.map +1 -0
  121. package/dist/api/brep-operations/threadFns.d.ts +83 -0
  122. package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
  123. package/dist/api/brep-operations/threadFns.js +138 -0
  124. package/dist/api/brep-operations/threadFns.js.map +1 -0
  125. package/dist/api/brep-operations/topologyFns.d.ts +90 -0
  126. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
  127. package/dist/api/brep-operations/topologyFns.js +276 -0
  128. package/dist/api/brep-operations/topologyFns.js.map +1 -0
  129. package/dist/api/brep-topology.d.ts +1 -1
  130. package/dist/api/brep-topology.d.ts.map +1 -1
  131. package/dist/api/brep-topology.js +1 -1
  132. package/dist/api/brep-topology.js.map +1 -1
  133. package/dist/api/brepjs-compat/index.d.ts +1 -1
  134. package/dist/api/brepjs-compat/index.js +3 -3
  135. package/dist/api/brepjs-compat/index.js.map +1 -1
  136. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
  137. package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
  138. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
  139. package/dist/api/curve-sketch/index.d.ts +235 -0
  140. package/dist/api/curve-sketch/index.d.ts.map +1 -0
  141. package/dist/api/curve-sketch/index.js +487 -0
  142. package/dist/api/curve-sketch/index.js.map +1 -0
  143. package/dist/api/engrave.d.ts.map +1 -1
  144. package/dist/api/engrave.js +3 -2
  145. package/dist/api/engrave.js.map +1 -1
  146. package/dist/api/export-brep.d.ts +41 -0
  147. package/dist/api/export-brep.d.ts.map +1 -0
  148. package/dist/api/export-brep.js +58 -0
  149. package/dist/api/export-brep.js.map +1 -0
  150. package/dist/api/export-stl.d.ts +50 -0
  151. package/dist/api/export-stl.d.ts.map +1 -0
  152. package/dist/api/export-stl.js +99 -0
  153. package/dist/api/export-stl.js.map +1 -0
  154. package/dist/api/extrude.d.ts +8 -11
  155. package/dist/api/extrude.d.ts.map +1 -1
  156. package/dist/api/extrude.js +11 -14
  157. package/dist/api/extrude.js.map +1 -1
  158. package/dist/api/fillet-variable.d.ts +2 -2
  159. package/dist/api/fillet-variable.js +2 -2
  160. package/dist/api/fillet-variable.js.map +1 -1
  161. package/dist/api/fillet.d.ts +2 -4
  162. package/dist/api/fillet.d.ts.map +1 -1
  163. package/dist/api/fillet.js +2 -4
  164. package/dist/api/fillet.js.map +1 -1
  165. package/dist/api/generated/2d.d.ts +4 -0
  166. package/dist/api/generated/2d.d.ts.map +1 -1
  167. package/dist/api/generated/2d.js +4 -0
  168. package/dist/api/generated/2d.js.map +1 -1
  169. package/dist/api/generated/core.d.ts +4 -0
  170. package/dist/api/generated/core.d.ts.map +1 -1
  171. package/dist/api/generated/core.js +4 -0
  172. package/dist/api/generated/core.js.map +1 -1
  173. package/dist/api/generated/gear.d.ts +4 -0
  174. package/dist/api/generated/gear.d.ts.map +1 -1
  175. package/dist/api/generated/gear.js +4 -0
  176. package/dist/api/generated/gear.js.map +1 -1
  177. package/dist/api/generated/io.d.ts +4 -0
  178. package/dist/api/generated/io.d.ts.map +1 -1
  179. package/dist/api/generated/io.js +4 -0
  180. package/dist/api/generated/io.js.map +1 -1
  181. package/dist/api/generated/kernel.d.ts +4 -0
  182. package/dist/api/generated/kernel.d.ts.map +1 -1
  183. package/dist/api/generated/kernel.js +4 -0
  184. package/dist/api/generated/kernel.js.map +1 -1
  185. package/dist/api/generated/measurement.d.ts +21 -21
  186. package/dist/api/generated/measurement.d.ts.map +1 -1
  187. package/dist/api/generated/measurement.js +25 -21
  188. package/dist/api/generated/measurement.js.map +1 -1
  189. package/dist/api/generated/ns.d.ts +4 -0
  190. package/dist/api/generated/ns.d.ts.map +1 -1
  191. package/dist/api/generated/ns.js +4 -0
  192. package/dist/api/generated/ns.js.map +1 -1
  193. package/dist/api/generated/operations.d.ts +32 -32
  194. package/dist/api/generated/operations.d.ts.map +1 -1
  195. package/dist/api/generated/operations.js +52 -48
  196. package/dist/api/generated/operations.js.map +1 -1
  197. package/dist/api/generated/projection.d.ts +4 -0
  198. package/dist/api/generated/projection.d.ts.map +1 -1
  199. package/dist/api/generated/projection.js +4 -0
  200. package/dist/api/generated/projection.js.map +1 -1
  201. package/dist/api/generated/query.d.ts +4 -0
  202. package/dist/api/generated/query.d.ts.map +1 -1
  203. package/dist/api/generated/query.js +4 -0
  204. package/dist/api/generated/query.js.map +1 -1
  205. package/dist/api/generated/sketching.d.ts +2 -2
  206. package/dist/api/generated/sketching.d.ts.map +1 -1
  207. package/dist/api/generated/sketching.js +7 -3
  208. package/dist/api/generated/sketching.js.map +1 -1
  209. package/dist/api/generated/text.d.ts +4 -0
  210. package/dist/api/generated/text.d.ts.map +1 -1
  211. package/dist/api/generated/text.js +4 -0
  212. package/dist/api/generated/text.js.map +1 -1
  213. package/dist/api/generated/topology.d.ts +45 -45
  214. package/dist/api/generated/topology.d.ts.map +1 -1
  215. package/dist/api/generated/topology.js +67 -63
  216. package/dist/api/generated/topology.js.map +1 -1
  217. package/dist/api/generated/view.d.ts +4 -0
  218. package/dist/api/generated/view.d.ts.map +1 -1
  219. package/dist/api/generated/view.js +4 -0
  220. package/dist/api/generated/view.js.map +1 -1
  221. package/dist/api/geom-types/constants.d.ts +11 -0
  222. package/dist/api/geom-types/constants.d.ts.map +1 -0
  223. package/dist/api/geom-types/constants.js +11 -0
  224. package/dist/api/geom-types/constants.js.map +1 -0
  225. package/dist/api/geom-types/index.d.ts +21 -0
  226. package/dist/api/geom-types/index.d.ts.map +1 -0
  227. package/dist/api/geom-types/index.js +22 -0
  228. package/dist/api/geom-types/index.js.map +1 -0
  229. package/dist/api/geom-types/planeOps.d.ts +98 -0
  230. package/dist/api/geom-types/planeOps.d.ts.map +1 -0
  231. package/dist/api/geom-types/planeOps.js +170 -0
  232. package/dist/api/geom-types/planeOps.js.map +1 -0
  233. package/dist/api/geom-types/planeTypes.d.ts +24 -0
  234. package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
  235. package/dist/api/geom-types/planeTypes.js +8 -0
  236. package/dist/api/geom-types/planeTypes.js.map +1 -0
  237. package/dist/api/geom-types/types.d.ts +64 -0
  238. package/dist/api/geom-types/types.d.ts.map +1 -0
  239. package/dist/api/geom-types/types.js +48 -0
  240. package/dist/api/geom-types/types.js.map +1 -0
  241. package/dist/api/geom-types/vecOps.d.ts +124 -0
  242. package/dist/api/geom-types/vecOps.d.ts.map +1 -0
  243. package/dist/api/geom-types/vecOps.js +202 -0
  244. package/dist/api/geom-types/vecOps.js.map +1 -0
  245. package/dist/api/geom.d.ts.map +1 -1
  246. package/dist/api/geom.js +6 -5
  247. package/dist/api/geom.js.map +1 -1
  248. package/dist/api/half-space.d.ts +56 -0
  249. package/dist/api/half-space.d.ts.map +1 -0
  250. package/dist/api/half-space.js +82 -0
  251. package/dist/api/half-space.js.map +1 -0
  252. package/dist/api/helix.d.ts +10 -1
  253. package/dist/api/helix.d.ts.map +1 -1
  254. package/dist/api/helix.js +19 -3
  255. package/dist/api/helix.js.map +1 -1
  256. package/dist/api/index.d.ts +15 -6
  257. package/dist/api/index.d.ts.map +1 -1
  258. package/dist/api/index.js +29 -8
  259. package/dist/api/index.js.map +1 -1
  260. package/dist/api/internal/compat-op.d.ts +4 -30
  261. package/dist/api/internal/compat-op.d.ts.map +1 -1
  262. package/dist/api/internal/compat-op.js +10 -42
  263. package/dist/api/internal/compat-op.js.map +1 -1
  264. package/dist/api/internal/compat-projection.d.ts +5 -5
  265. package/dist/api/internal/compat-projection.js +5 -5
  266. package/dist/api/internal/compat-projection.js.map +1 -1
  267. package/dist/api/internal/dual-form-args.d.ts +0 -2
  268. package/dist/api/internal/dual-form-args.d.ts.map +1 -1
  269. package/dist/api/internal/dual-form-args.js +1 -3
  270. package/dist/api/internal/dual-form-args.js.map +1 -1
  271. package/dist/api/internal/l3-bridge.d.ts +5 -37
  272. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  273. package/dist/api/internal/l3-bridge.js +7 -76
  274. package/dist/api/internal/l3-bridge.js.map +1 -1
  275. package/dist/api/internal/profile-wire.d.ts +1 -1
  276. package/dist/api/internal/profile-wire.js +1 -1
  277. package/dist/api/internal/profile-wire.js.map +1 -1
  278. package/dist/api/internal/result-unwrap.d.ts +4 -6
  279. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  280. package/dist/api/internal/result-unwrap.js +4 -6
  281. package/dist/api/internal/result-unwrap.js.map +1 -1
  282. package/dist/api/knurl.d.ts.map +1 -1
  283. package/dist/api/knurl.js +5 -3
  284. package/dist/api/knurl.js.map +1 -1
  285. package/dist/api/loft.d.ts +2 -2
  286. package/dist/api/loft.d.ts.map +1 -1
  287. package/dist/api/loft.js +2 -2
  288. package/dist/api/loft.js.map +1 -1
  289. package/dist/api/measurement/index.d.ts +3 -3
  290. package/dist/api/measurement/index.js +3 -3
  291. package/dist/api/measurement/index.js.map +1 -1
  292. package/dist/api/meta.d.ts +0 -2
  293. package/dist/api/meta.d.ts.map +1 -1
  294. package/dist/api/meta.js +0 -2
  295. package/dist/api/meta.js.map +1 -1
  296. package/dist/api/offset2d.d.ts +49 -0
  297. package/dist/api/offset2d.d.ts.map +1 -0
  298. package/dist/api/offset2d.js +86 -0
  299. package/dist/api/offset2d.js.map +1 -0
  300. package/dist/api/pattern.js +3 -3
  301. package/dist/api/pattern.js.map +1 -1
  302. package/dist/api/primitives.d.ts.map +1 -1
  303. package/dist/api/primitives.js +7 -6
  304. package/dist/api/primitives.js.map +1 -1
  305. package/dist/api/replicate.d.ts +2 -2
  306. package/dist/api/replicate.d.ts.map +1 -1
  307. package/dist/api/replicate.js +12 -12
  308. package/dist/api/replicate.js.map +1 -1
  309. package/dist/api/result.d.ts +1 -1
  310. package/dist/api/result.js +1 -1
  311. package/dist/api/result.js.map +1 -1
  312. package/dist/api/revolve.d.ts +2 -2
  313. package/dist/api/revolve.js +3 -3
  314. package/dist/api/revolve.js.map +1 -1
  315. package/dist/api/screw.d.ts +1 -1
  316. package/dist/api/screw.d.ts.map +1 -1
  317. package/dist/api/screw.js +5 -4
  318. package/dist/api/screw.js.map +1 -1
  319. package/dist/api/sdf.d.ts.map +1 -1
  320. package/dist/api/sdf.js +3 -2
  321. package/dist/api/sdf.js.map +1 -1
  322. package/dist/api/shape-type/index.d.ts +141 -0
  323. package/dist/api/shape-type/index.d.ts.map +1 -0
  324. package/dist/api/shape-type/index.js +182 -0
  325. package/dist/api/shape-type/index.js.map +1 -0
  326. package/dist/api/shell.d.ts +2 -2
  327. package/dist/api/shell.js +2 -2
  328. package/dist/api/shell.js.map +1 -1
  329. package/dist/api/solid-from-faces.d.ts +45 -0
  330. package/dist/api/solid-from-faces.d.ts.map +1 -0
  331. package/dist/api/solid-from-faces.js +72 -0
  332. package/dist/api/solid-from-faces.js.map +1 -0
  333. package/dist/api/solid-offset/index.d.ts +67 -0
  334. package/dist/api/solid-offset/index.d.ts.map +1 -0
  335. package/dist/api/solid-offset/index.js +132 -0
  336. package/dist/api/solid-offset/index.js.map +1 -0
  337. package/dist/api/surface/arg-spec.d.ts +35 -33
  338. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  339. package/dist/api/surface/arg-spec.js +222 -224
  340. package/dist/api/surface/arg-spec.js.map +1 -1
  341. package/dist/api/surface-face/index.d.ts +104 -0
  342. package/dist/api/surface-face/index.d.ts.map +1 -0
  343. package/dist/api/surface-face/index.js +217 -0
  344. package/dist/api/surface-face/index.js.map +1 -0
  345. package/dist/api/surface.d.ts +44 -0
  346. package/dist/api/surface.d.ts.map +1 -0
  347. package/dist/api/surface.js +66 -0
  348. package/dist/api/surface.js.map +1 -0
  349. package/dist/api/sweep.d.ts +59 -9
  350. package/dist/api/sweep.d.ts.map +1 -1
  351. package/dist/api/sweep.js +11 -6
  352. package/dist/api/sweep.js.map +1 -1
  353. package/dist/api/thicken.d.ts +1 -1
  354. package/dist/api/thicken.js +1 -1
  355. package/dist/api/thicken.js.map +1 -1
  356. package/dist/api/transform.d.ts +5 -5
  357. package/dist/api/transform.d.ts.map +1 -1
  358. package/dist/api/transform.js +11 -10
  359. package/dist/api/transform.js.map +1 -1
  360. package/dist/api/view/cameraFns.d.ts +1 -1
  361. package/dist/api/view/cameraFns.d.ts.map +1 -1
  362. package/dist/api/view/cameraFns.js +1 -1
  363. package/dist/api/view/cameraFns.js.map +1 -1
  364. package/dist/api/view/index.d.ts +0 -2
  365. package/dist/api/view/index.d.ts.map +1 -1
  366. package/dist/api/view/index.js +0 -2
  367. package/dist/api/view/index.js.map +1 -1
  368. package/dist/api/view/projectionPlanes.d.ts +1 -1
  369. package/dist/api/view/projectionPlanes.d.ts.map +1 -1
  370. package/dist/api/view/projectionPlanes.js.map +1 -1
  371. package/dist/api/view/view-camera.d.ts +7 -9
  372. package/dist/api/view/view-camera.d.ts.map +1 -1
  373. package/dist/api/view/view-camera.js +4 -6
  374. package/dist/api/view/view-camera.js.map +1 -1
  375. package/dist/api/view/view-projection.d.ts +0 -2
  376. package/dist/api/view/view-projection.d.ts.map +1 -1
  377. package/dist/api/view/view-projection.js +0 -2
  378. package/dist/api/view/view-projection.js.map +1 -1
  379. package/dist/api/view/view-sheet.d.ts +0 -2
  380. package/dist/api/view/view-sheet.d.ts.map +1 -1
  381. package/dist/api/view/view-sheet.js +0 -2
  382. package/dist/api/view/view-sheet.js.map +1 -1
  383. package/dist/api/view-export/index.d.ts +97 -0
  384. package/dist/api/view-export/index.d.ts.map +1 -0
  385. package/dist/api/view-export/index.js +118 -0
  386. package/dist/api/view-export/index.js.map +1 -0
  387. package/dist/brep/brep-ops.d.ts +89 -1
  388. package/dist/brep/brep-ops.d.ts.map +1 -1
  389. package/dist/brep/brep-ops.js +176 -10
  390. package/dist/brep/brep-ops.js.map +1 -1
  391. package/dist/brep/brep-topology.d.ts +20 -0
  392. package/dist/brep/brep-topology.d.ts.map +1 -1
  393. package/dist/brep/brep-topology.js +46 -0
  394. package/dist/brep/brep-topology.js.map +1 -1
  395. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  396. package/dist/brep/engine/adapters/occt.js +7 -7
  397. package/dist/brep/engine/adapters/occt.js.map +1 -1
  398. package/dist/brep/engine/primitives.d.ts +2 -3
  399. package/dist/brep/engine/primitives.d.ts.map +1 -1
  400. package/dist/brep/engine/primitives.js +1 -2
  401. package/dist/brep/engine/primitives.js.map +1 -1
  402. package/dist/brep/engine/registry.d.ts +1 -1
  403. package/dist/brep/engine/registry.js +1 -1
  404. package/dist/brep/engine/registry.js.map +1 -1
  405. package/dist/brep/engine/types.d.ts +2 -2
  406. package/dist/brep/engine/types.js.map +1 -1
  407. package/dist/brep/handle-bridge.d.ts +2 -2
  408. package/dist/brep/handle-bridge.js +2 -2
  409. package/dist/brep/handle-bridge.js.map +1 -1
  410. package/dist/brep/index.d.ts +6 -3
  411. package/dist/brep/index.d.ts.map +1 -1
  412. package/dist/brep/index.js +6 -3
  413. package/dist/brep/index.js.map +1 -1
  414. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  415. package/dist/brepkit-kernel/brepkitKernel.js +2 -2
  416. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  417. package/dist/browser.d.ts +2 -2
  418. package/dist/browser.d.ts.map +1 -1
  419. package/dist/browser.js +5 -4
  420. package/dist/browser.js.map +1 -1
  421. package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
  422. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  423. package/dist/cad-runtime/admit-compat-lib.js +3 -9
  424. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  425. package/dist/cad-runtime/backend-dispatch.js +12 -3
  426. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  427. package/dist/cad-runtime/direct-executor.d.ts +6 -3
  428. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  429. package/dist/cad-runtime/direct-executor.js +31 -9
  430. package/dist/cad-runtime/direct-executor.js.map +1 -1
  431. package/dist/cad-runtime/interp/env.d.ts +1 -1
  432. package/dist/cad-runtime/interp/env.js.map +1 -1
  433. package/dist/cad-runtime/lib-id.d.ts +0 -2
  434. package/dist/cad-runtime/lib-id.d.ts.map +1 -1
  435. package/dist/cad-runtime/lib-id.js +0 -2
  436. package/dist/cad-runtime/lib-id.js.map +1 -1
  437. package/dist/cad-runtime/live-shapes.d.ts +3 -5
  438. package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
  439. package/dist/cad-runtime/live-shapes.js +8 -10
  440. package/dist/cad-runtime/live-shapes.js.map +1 -1
  441. package/dist/cad-runtime/ports.d.ts +3 -3
  442. package/dist/cad-runtime/ports.js.map +1 -1
  443. package/dist/cad-runtime/runtime.d.ts +21 -7
  444. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  445. package/dist/cad-runtime/runtime.js +45 -6
  446. package/dist/cad-runtime/runtime.js.map +1 -1
  447. package/dist/define-op.d.ts +4 -3
  448. package/dist/define-op.d.ts.map +1 -1
  449. package/dist/define-op.js +2 -2
  450. package/dist/define-op.js.map +1 -1
  451. package/dist/geometry2d/bridge/plane.d.ts +1 -1
  452. package/dist/geometry2d/bridge/plane.js +1 -1
  453. package/dist/geometry2d/bridge/plane.js.map +1 -1
  454. package/dist/geometry2d/curve2d.d.ts +1 -1
  455. package/dist/geometry2d/curve2d.js +1 -1
  456. package/dist/geometry2d/curve2d.js.map +1 -1
  457. package/dist/index.d.ts +1 -1
  458. package/dist/index.d.ts.map +1 -1
  459. package/dist/index.js +10 -4
  460. package/dist/index.js.map +1 -1
  461. package/dist/io/fai-zip/container-read.d.ts +16 -0
  462. package/dist/io/fai-zip/container-read.d.ts.map +1 -1
  463. package/dist/io/fai-zip/container-read.js +22 -0
  464. package/dist/io/fai-zip/container-read.js.map +1 -1
  465. package/dist/io/fai-zip/index.d.ts +1 -1
  466. package/dist/io/fai-zip/index.d.ts.map +1 -1
  467. package/dist/io/fai-zip/index.js +1 -1
  468. package/dist/io/fai-zip/index.js.map +1 -1
  469. package/dist/lang/code-to-args.d.ts.map +1 -1
  470. package/dist/lang/code-to-args.js +10 -1
  471. package/dist/lang/code-to-args.js.map +1 -1
  472. package/dist/lang/determinism-scanner.d.ts.map +1 -1
  473. package/dist/lang/determinism-scanner.js +22 -9
  474. package/dist/lang/determinism-scanner.js.map +1 -1
  475. package/dist/lang/metadata-extractor.d.ts +27 -6
  476. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  477. package/dist/lang/metadata-extractor.js +88 -8
  478. package/dist/lang/metadata-extractor.js.map +1 -1
  479. package/dist/lang/parse-error.d.ts +4 -0
  480. package/dist/lang/parse-error.d.ts.map +1 -1
  481. package/dist/lang/parse-error.js.map +1 -1
  482. package/dist/lang/security-scanner.d.ts +27 -2
  483. package/dist/lang/security-scanner.d.ts.map +1 -1
  484. package/dist/lang/security-scanner.js +29 -2
  485. package/dist/lang/security-scanner.js.map +1 -1
  486. package/dist/lang/source-edit.d.ts +2 -2
  487. package/dist/lang/source-edit.js.map +1 -1
  488. package/dist/lang/symbol-table.generated.d.ts +36 -0
  489. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  490. package/dist/lang/symbol-table.generated.js +36 -0
  491. package/dist/lang/symbol-table.generated.js.map +1 -1
  492. package/dist/mesh/import-model.d.ts +94 -0
  493. package/dist/mesh/import-model.d.ts.map +1 -0
  494. package/dist/mesh/import-model.js +15 -0
  495. package/dist/mesh/import-model.js.map +1 -0
  496. package/dist/mesh/index.d.ts +19 -58
  497. package/dist/mesh/index.d.ts.map +1 -1
  498. package/dist/mesh/index.js +19 -70
  499. package/dist/mesh/index.js.map +1 -1
  500. package/dist/mesh/io.d.ts +33 -16
  501. package/dist/mesh/io.d.ts.map +1 -1
  502. package/dist/mesh/io.js +144 -39
  503. package/dist/mesh/io.js.map +1 -1
  504. package/dist/mesh/primitives.js +1 -1
  505. package/dist/mesh/primitives.js.map +1 -1
  506. package/dist/mesh/threemf-bambu.d.ts +12 -1
  507. package/dist/mesh/threemf-bambu.d.ts.map +1 -1
  508. package/dist/mesh/threemf-bambu.js +68 -16
  509. package/dist/mesh/threemf-bambu.js.map +1 -1
  510. package/dist/mesh/threemf-loader.d.ts +14 -1
  511. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  512. package/dist/mesh/threemf-loader.js +24 -7
  513. package/dist/mesh/threemf-loader.js.map +1 -1
  514. package/dist/mesh/transform.d.ts +1 -1
  515. package/dist/mesh/transform.js +1 -1
  516. package/dist/mesh/transform.js.map +1 -1
  517. package/dist/mesh/types.d.ts +5 -5
  518. package/dist/mesh/types.d.ts.map +1 -1
  519. package/dist/mesh/types.js.map +1 -1
  520. package/dist/node-host/cli.d.ts +49 -1
  521. package/dist/node-host/cli.d.ts.map +1 -1
  522. package/dist/node-host/cli.js +125 -19
  523. package/dist/node-host/cli.js.map +1 -1
  524. package/dist/node-host/execute-script.d.ts +55 -0
  525. package/dist/node-host/execute-script.d.ts.map +1 -0
  526. package/dist/node-host/execute-script.js +46 -0
  527. package/dist/node-host/execute-script.js.map +1 -0
  528. package/dist/node.d.ts +2 -0
  529. package/dist/node.d.ts.map +1 -1
  530. package/dist/node.js +3 -0
  531. package/dist/node.js.map +1 -1
  532. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
  533. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
  534. package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
  535. package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
  536. package/dist/occt-kernel/hullGeometry.d.ts +2 -2
  537. package/dist/occt-kernel/hullGeometry.js +2 -3
  538. package/dist/occt-kernel/hullGeometry.js.map +1 -1
  539. package/dist/occt-kernel/hullOps.d.ts +3 -3
  540. package/dist/occt-kernel/hullOps.js +4 -4
  541. package/dist/occt-kernel/hullOps.js.map +1 -1
  542. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  543. package/dist/occt-kernel/occt-primitives.js +31 -4
  544. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  545. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  546. package/dist/occt-kernel/occtKernel.js +18 -0
  547. package/dist/occt-kernel/occtKernel.js.map +1 -1
  548. package/dist/occt-scan/recognize.d.ts +58 -0
  549. package/dist/occt-scan/recognize.d.ts.map +1 -0
  550. package/dist/occt-scan/recognize.js +216 -0
  551. package/dist/occt-scan/recognize.js.map +1 -0
  552. package/dist/primitives/brep-primitives.js +7 -7
  553. package/dist/primitives/brep-primitives.js.map +1 -1
  554. package/dist/result/bug.d.ts +1 -1
  555. package/dist/result/bug.js +1 -1
  556. package/dist/result/bug.js.map +1 -1
  557. package/dist/result/errors.d.ts +2 -2
  558. package/dist/result/errors.d.ts.map +1 -1
  559. package/dist/result/errors.js +1 -1
  560. package/dist/result/errors.js.map +1 -1
  561. package/dist/result/vec3.d.ts +1 -1
  562. package/dist/result/vec3.js +1 -1
  563. package/dist/result/vec3.js.map +1 -1
  564. package/dist/runtime-state.d.ts +16 -0
  565. package/dist/runtime-state.d.ts.map +1 -1
  566. package/dist/runtime-state.js +27 -0
  567. package/dist/runtime-state.js.map +1 -1
  568. package/dist/script-globals.d.ts +24 -0
  569. package/dist/script-globals.d.ts.map +1 -0
  570. package/dist/script-globals.js +24 -0
  571. package/dist/script-globals.js.map +1 -0
  572. package/dist/shape.d.ts +24 -0
  573. package/dist/shape.d.ts.map +1 -1
  574. package/dist/shape.js +40 -0
  575. package/dist/shape.js.map +1 -1
  576. package/dist/topology/naming/lineage.d.ts +3 -2
  577. package/dist/topology/naming/lineage.d.ts.map +1 -1
  578. package/dist/topology/naming/lineage.js.map +1 -1
  579. package/dist/weapp.d.ts +1 -1
  580. package/dist/weapp.js +1 -1
  581. package/dist/weapp.js.map +1 -1
  582. package/package.json +8 -10
@@ -1,27 +1,25 @@
1
1
  /**
2
2
  * view-camera — 视图规格 → 投影相机(faijs 视图投影能力,路径 A 纯数据面)
3
3
  *
4
- * 设计文档:docs/plans/2026-09-10-faijs-view-projection-and-screenshot.md §3.2
5
- *
6
4
  * 视图规格(ViewSpec):
7
5
  * - 六个标准正交视图:'front' | 'back' | 'top' | 'bottom' | 'left' | 'right'
8
- * (方向沿用 vendored brepjs PROJECTION_PLANES:front=(0,-1,0)、top=(0,0,-1)…,
6
+ * (方向沿用早期 brepjs PROJECTION_PLANES:front=(0,-1,0)、top=(0,0,-1)…,
9
7
  * 与 FreeCAD TechDraw 的方向向量惯例一致,见方案 §2.2);
10
8
  * - 等轴测:'iso' | 'isometric'(方向 (1,-1,1),方案 §2.3 定稿);
11
- * - 轴对平面:'XY' | 'XZ' | 'YZ' | 'YX' | 'ZX' | 'ZY'(vendored 平面名);
9
+ * - 轴对平面:'XY' | 'XZ' | 'YZ' | 'YX' | 'ZX' | 'ZY'(早期平面名);
12
10
  * - 任意方向:{ dir: Vec3, xAxis?: Vec3 }(xAxis 缺省由方向自动推导)。
13
11
  *
14
12
  * viewCamera 是纯数据函数(无 Shape 输入,kind 'pure' 语义):把视图规格解析成
15
- * vendored brepjs 的 Camera 纯数据对象,供 projectView/projectSheet 与宿主复用。
16
- * 返回类型 re-export 自 vendored(api/generated/projection.ts 已登记 Camera type)。
13
+ * Camera 纯数据对象,供 projectView/projectSheet 与宿主复用。
14
+ * 返回类型 re-export 自第一方投影模块(api/generated/projection.ts 已登记 Camera type)。
17
15
  */
18
16
  import { type Camera } from './cameraFns.js';
19
- import type { Vec3 } from '../brepjs-compat/types.js';
20
- /** 六个标准正交视图名(vendored CubeFace 同集)。 */
17
+ import type { Vec3 } from '../geom-types/types.js';
18
+ /** 六个标准正交视图名(与 CubeFace 同集)。 */
21
19
  export type StandardView = 'front' | 'back' | 'top' | 'bottom' | 'left' | 'right';
22
20
  /** 等轴测视图名(faijs 新增别名;方向 (1,-1,1))。 */
23
21
  export type IsoView = 'iso' | 'isometric';
24
- /** 轴对平面名(vendored ProjectionPlane 的子集)。 */
22
+ /** 轴对平面名(ProjectionPlane 的子集)。 */
25
23
  export type AxisPlaneView = 'XY' | 'XZ' | 'YZ' | 'YX' | 'ZX' | 'ZY';
26
24
  /** 任意方向视图规格。 */
27
25
  export interface DirectionView {
@@ -1 +1 @@
1
- {"version":3,"file":"view-camera.d.ts","sourceRoot":"","sources":["../../../src/api/view/view-camera.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAiC,KAAK,MAAM,EAAE,MAAM,aAAa,CAAA;AAGxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAElD,uCAAuC;AACvC,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAEjF,sCAAsC;AACtC,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,WAAW,CAAA;AAEzC,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAEnE,gBAAgB;AAChB,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,GAAG,EAAE,IAAI,CAAA;IACT,wBAAwB;IACxB,KAAK,CAAC,EAAE,IAAI,CAAA;CACb;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,aAAa,GAAG,aAAa,CAAA;AAK7E;;;;;;;;;;;;IAYI;AACJ,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAYjD;AAED,4EAA4E;AAC5E,eAAO,MAAM,aAAa,mBAAa,CAAA"}
1
+ {"version":3,"file":"view-camera.d.ts","sourceRoot":"","sources":["../../../src/api/view/view-camera.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAiC,KAAK,MAAM,EAAE,MAAM,aAAa,CAAA;AAGxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAE/C,gCAAgC;AAChC,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAEjF,sCAAsC;AACtC,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,WAAW,CAAA;AAEzC,kCAAkC;AAClC,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAEnE,gBAAgB;AAChB,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,GAAG,EAAE,IAAI,CAAA;IACT,wBAAwB;IACxB,KAAK,CAAC,EAAE,IAAI,CAAA;CACb;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,aAAa,GAAG,aAAa,CAAA;AAK7E;;;;;;;;;;;;IAYI;AACJ,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAYjD;AAED,4EAA4E;AAC5E,eAAO,MAAM,aAAa,mBAAa,CAAA"}
@@ -1,19 +1,17 @@
1
1
  /**
2
2
  * view-camera — 视图规格 → 投影相机(faijs 视图投影能力,路径 A 纯数据面)
3
3
  *
4
- * 设计文档:docs/plans/2026-09-10-faijs-view-projection-and-screenshot.md §3.2
5
- *
6
4
  * 视图规格(ViewSpec):
7
5
  * - 六个标准正交视图:'front' | 'back' | 'top' | 'bottom' | 'left' | 'right'
8
- * (方向沿用 vendored brepjs PROJECTION_PLANES:front=(0,-1,0)、top=(0,0,-1)…,
6
+ * (方向沿用早期 brepjs PROJECTION_PLANES:front=(0,-1,0)、top=(0,0,-1)…,
9
7
  * 与 FreeCAD TechDraw 的方向向量惯例一致,见方案 §2.2);
10
8
  * - 等轴测:'iso' | 'isometric'(方向 (1,-1,1),方案 §2.3 定稿);
11
- * - 轴对平面:'XY' | 'XZ' | 'YZ' | 'YX' | 'ZX' | 'ZY'(vendored 平面名);
9
+ * - 轴对平面:'XY' | 'XZ' | 'YZ' | 'YX' | 'ZX' | 'ZY'(早期平面名);
12
10
  * - 任意方向:{ dir: Vec3, xAxis?: Vec3 }(xAxis 缺省由方向自动推导)。
13
11
  *
14
12
  * viewCamera 是纯数据函数(无 Shape 输入,kind 'pure' 语义):把视图规格解析成
15
- * vendored brepjs 的 Camera 纯数据对象,供 projectView/projectSheet 与宿主复用。
16
- * 返回类型 re-export 自 vendored(api/generated/projection.ts 已登记 Camera type)。
13
+ * Camera 纯数据对象,供 projectView/projectSheet 与宿主复用。
14
+ * 返回类型 re-export 自第一方投影模块(api/generated/projection.ts 已登记 Camera type)。
17
15
  */
18
16
  import { createCamera, cameraFromPlane } from './cameraFns.js';
19
17
  import { isProjectionPlane } from './projectionPlanes.js';
@@ -1 +1 @@
1
- {"version":3,"file":"view-camera.js","sourceRoot":"","sources":["../../../src/api/view/view-camera.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAe,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAyB5C,kDAAkD;AAClD,MAAM,OAAO,GAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEhC;;;;;;;;;;;;IAYI;AACJ,MAAM,UAAU,UAAU,CAAC,IAAc;IACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3C,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;QACjD,CAAC;QACD,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAA;QACtC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,6EAA6E,CAAC,CAAA;IAClI,CAAC;IACD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IAC3B,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;AACpD,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAA","sourcesContent":["/**\n * view-camera — 视图规格 → 投影相机(faijs 视图投影能力,路径 A 纯数据面)\n *\n * 设计文档:docs/plans/2026-09-10-faijs-view-projection-and-screenshot.md §3.2\n *\n * 视图规格(ViewSpec):\n * - 六个标准正交视图:'front' | 'back' | 'top' | 'bottom' | 'left' | 'right'\n * (方向沿用 vendored brepjs PROJECTION_PLANES:front=(0,-1,0)、top=(0,0,-1)…,\n * 与 FreeCAD TechDraw 的方向向量惯例一致,见方案 §2.2);\n * - 等轴测:'iso' | 'isometric'(方向 (1,-1,1),方案 §2.3 定稿);\n * - 轴对平面:'XY' | 'XZ' | 'YZ' | 'YX' | 'ZX' | 'ZY'(vendored 平面名);\n * - 任意方向:{ dir: Vec3, xAxis?: Vec3 }(xAxis 缺省由方向自动推导)。\n *\n * viewCamera 是纯数据函数(无 Shape 输入,kind 'pure' 语义):把视图规格解析成\n * vendored brepjs 的 Camera 纯数据对象,供 projectView/projectSheet 与宿主复用。\n * 返回类型 re-export 自 vendored(api/generated/projection.ts 已登记 Camera type)。\n */\n\nimport { createCamera, cameraFromPlane, type Camera } from './cameraFns'\nimport { isProjectionPlane } from './projectionPlanes'\nimport { unwrap } from '../../result/result'\nimport type { Vec3 } from '../brepjs-compat/types'\n\n/** 六个标准正交视图名(vendored CubeFace 同集)。 */\nexport type StandardView = 'front' | 'back' | 'top' | 'bottom' | 'left' | 'right'\n\n/** 等轴测视图名(faijs 新增别名;方向 (1,-1,1))。 */\nexport type IsoView = 'iso' | 'isometric'\n\n/** 轴对平面名(vendored ProjectionPlane 的子集)。 */\nexport type AxisPlaneView = 'XY' | 'XZ' | 'YZ' | 'YX' | 'ZX' | 'ZY'\n\n/** 任意方向视图规格。 */\nexport interface DirectionView {\n /** 视向(相机沿此方向观察;零向量报错)。 */\n dir: Vec3\n /** 可选水平轴(缺省由方向自动推导)。 */\n xAxis?: Vec3\n}\n\n/**\n * faijs 视图投影的视图规格:标准正交 / 等轴测 / 轴对平面 / 任意方向。\n */\nexport type ViewSpec = StandardView | IsoView | AxisPlaneView | DirectionView\n\n/** 等轴测视向(方案 §2.3:Iso=(1,-1,1),与 FreeCAD 惯例一致)。 */\nconst ISO_DIR: Vec3 = [1, -1, 1]\n\n/**\n * 解析视图规格为投影相机(纯数据,无 Shape 输入;不消费任何几何)。\n * @group 查询\n * @inputs 0\n * @async false\n * @qual ok\n * @name viewCamera\n * @returns { direction, xAxis? } 归一化方向向量(iso = (1,-1,1)/√3,与 FreeCAD/OCCT 惯例一致)。未知视图名抛错;零方向向量抛错。用于 3d_editor 侧三轴相机渲染(mesh/SDF 形状的截图通道)。\n * @param view - 视图规格:标准视图名(front/back/top/bottom/left/right/iso(=isometric)/XY/XZ/YZ/YX/ZX/ZY)或方向对象。type:string|{dir,xAxis?} required:true\n * @example\n * const cam = cad.viewCamera('iso')\n * const cam = cad.viewCamera({ dir: [1, -1, 1] })\n */\nexport function viewCamera(view: ViewSpec): Camera {\n if (typeof view === 'string') {\n if (view === 'iso' || view === 'isometric') {\n return unwrap(createCamera([0, 0, 0], ISO_DIR))\n }\n if (isProjectionPlane(view)) {\n return unwrap(cameraFromPlane(view))\n }\n throw new Error(`[faijs/view] unknown view '${view}' (expected front/back/top/bottom/left/right/iso/isometric or an axis pair)`)\n }\n const { dir, xAxis } = view\n return unwrap(createCamera([0, 0, 0], dir, xAxis))\n}\n\n/** resolveCamera = viewCamera 别名(projectView/projectSheet 内部使用;与方案措辞一致)。 */\nexport const resolveCamera = viewCamera\n"]}
1
+ {"version":3,"file":"view-camera.js","sourceRoot":"","sources":["../../../src/api/view/view-camera.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAe,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAyB5C,kDAAkD;AAClD,MAAM,OAAO,GAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEhC;;;;;;;;;;;;IAYI;AACJ,MAAM,UAAU,UAAU,CAAC,IAAc;IACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3C,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;QACjD,CAAC;QACD,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAA;QACtC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,6EAA6E,CAAC,CAAA;IAClI,CAAC;IACD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IAC3B,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;AACpD,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAA","sourcesContent":["/**\n * view-camera — 视图规格 → 投影相机(faijs 视图投影能力,路径 A 纯数据面)\n *\n * 视图规格(ViewSpec):\n * - 六个标准正交视图:'front' | 'back' | 'top' | 'bottom' | 'left' | 'right'\n * (方向沿用早期 brepjs PROJECTION_PLANES:front=(0,-1,0)、top=(0,0,-1)…,\n * 与 FreeCAD TechDraw 的方向向量惯例一致,见方案 §2.2);\n * - 等轴测:'iso' | 'isometric'(方向 (1,-1,1),方案 §2.3 定稿);\n * - 轴对平面:'XY' | 'XZ' | 'YZ' | 'YX' | 'ZX' | 'ZY'(早期平面名);\n * - 任意方向:{ dir: Vec3, xAxis?: Vec3 }(xAxis 缺省由方向自动推导)。\n *\n * viewCamera 是纯数据函数(无 Shape 输入,kind 'pure' 语义):把视图规格解析成\n * Camera 纯数据对象,供 projectView/projectSheet 与宿主复用。\n * 返回类型 re-export 自第一方投影模块(api/generated/projection.ts 已登记 Camera type)。\n */\n\nimport { createCamera, cameraFromPlane, type Camera } from './cameraFns'\nimport { isProjectionPlane } from './projectionPlanes'\nimport { unwrap } from '../../result/result'\nimport type { Vec3 } from '../geom-types/types'\n\n/** 六个标准正交视图名(与 CubeFace 同集)。 */\nexport type StandardView = 'front' | 'back' | 'top' | 'bottom' | 'left' | 'right'\n\n/** 等轴测视图名(faijs 新增别名;方向 (1,-1,1))。 */\nexport type IsoView = 'iso' | 'isometric'\n\n/** 轴对平面名(ProjectionPlane 的子集)。 */\nexport type AxisPlaneView = 'XY' | 'XZ' | 'YZ' | 'YX' | 'ZX' | 'ZY'\n\n/** 任意方向视图规格。 */\nexport interface DirectionView {\n /** 视向(相机沿此方向观察;零向量报错)。 */\n dir: Vec3\n /** 可选水平轴(缺省由方向自动推导)。 */\n xAxis?: Vec3\n}\n\n/**\n * faijs 视图投影的视图规格:标准正交 / 等轴测 / 轴对平面 / 任意方向。\n */\nexport type ViewSpec = StandardView | IsoView | AxisPlaneView | DirectionView\n\n/** 等轴测视向(方案 §2.3:Iso=(1,-1,1),与 FreeCAD 惯例一致)。 */\nconst ISO_DIR: Vec3 = [1, -1, 1]\n\n/**\n * 解析视图规格为投影相机(纯数据,无 Shape 输入;不消费任何几何)。\n * @group 查询\n * @inputs 0\n * @async false\n * @qual ok\n * @name viewCamera\n * @returns { direction, xAxis? } 归一化方向向量(iso = (1,-1,1)/√3,与 FreeCAD/OCCT 惯例一致)。未知视图名抛错;零方向向量抛错。用于 3d_editor 侧三轴相机渲染(mesh/SDF 形状的截图通道)。\n * @param view - 视图规格:标准视图名(front/back/top/bottom/left/right/iso(=isometric)/XY/XZ/YZ/YX/ZX/ZY)或方向对象。type:string|{dir,xAxis?} required:true\n * @example\n * const cam = cad.viewCamera('iso')\n * const cam = cad.viewCamera({ dir: [1, -1, 1] })\n */\nexport function viewCamera(view: ViewSpec): Camera {\n if (typeof view === 'string') {\n if (view === 'iso' || view === 'isometric') {\n return unwrap(createCamera([0, 0, 0], ISO_DIR))\n }\n if (isProjectionPlane(view)) {\n return unwrap(cameraFromPlane(view))\n }\n throw new Error(`[faijs/view] unknown view '${view}' (expected front/back/top/bottom/left/right/iso/isometric or an axis pair)`)\n }\n const { dir, xAxis } = view\n return unwrap(createCamera([0, 0, 0], dir, xAxis))\n}\n\n/** resolveCamera = viewCamera 别名(projectView/projectSheet 内部使用;与方案措辞一致)。 */\nexport const resolveCamera = viewCamera\n"]}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * view-projection — 单视图投影 → SVG 线稿(faijs 视图投影能力,路径 A)
3
3
  *
4
- * 设计文档:docs/plans/2026-09-10-faijs-view-projection-and-screenshot.md §3.2
5
- *
6
4
  * projectView(shape, view, opts?) 返回**纯数据 SVG 字符串**(非 Shape):
7
5
  * - 直连 core 引擎的 HLR 投影(`BrepEngineApi.projectEdges`,OCCT
8
6
  * HLRBRep 隐线消除):可见 / 隐藏两组边(sharp/smooth/outline compound);
@@ -1 +1 @@
1
- {"version":3,"file":"view-projection.d.ts","sourceRoot":"","sources":["../../../src/api/view/view-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAI7C,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAU5D,0BAA0B;AAC1B,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sBAAsB;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,oCAAoC;AACpC,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAA;IACf,8BAA8B;IAC9B,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IAC9C,eAAe;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAyID;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE,kBAAuB,GAAG,aAAa,CA2BzG;AAED;;;;;;;;;;;;;;;;;;;IAmBI;AACJ,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAE3F"}
1
+ {"version":3,"file":"view-projection.d.ts","sourceRoot":"","sources":["../../../src/api/view/view-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAI7C,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAU5D,0BAA0B;AAC1B,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sBAAsB;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,oCAAoC;AACpC,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAA;IACf,8BAA8B;IAC9B,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IAC9C,eAAe;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAyID;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE,kBAAuB,GAAG,aAAa,CA2BzG;AAED;;;;;;;;;;;;;;;;;;;IAmBI;AACJ,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAE3F"}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * view-projection — 单视图投影 → SVG 线稿(faijs 视图投影能力,路径 A)
3
3
  *
4
- * 设计文档:docs/plans/2026-09-10-faijs-view-projection-and-screenshot.md §3.2
5
- *
6
4
  * projectView(shape, view, opts?) 返回**纯数据 SVG 字符串**(非 Shape):
7
5
  * - 直连 core 引擎的 HLR 投影(`BrepEngineApi.projectEdges`,OCCT
8
6
  * HLRBRep 隐线消除):可见 / 隐藏两组边(sharp/smooth/outline compound);
@@ -1 +1 @@
1
- {"version":3,"file":"view-projection.js","sourceRoot":"","sources":["../../../src/api/view/view-projection.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * view-projection — 单视图投影 → SVG 线稿(faijs 视图投影能力,路径 A)\n *\n * 设计文档:docs/plans/2026-09-10-faijs-view-projection-and-screenshot.md §3.2\n *\n * projectView(shape, view, opts?) 返回**纯数据 SVG 字符串**(非 Shape):\n * - 直连 core 引擎的 HLR 投影(`BrepEngineApi.projectEdges`,OCCT\n * HLRBRep 隐线消除):可见 / 隐藏两组边(sharp/smooth/outline compound);\n * - 每组边 → 3D 曲线采样折线(`curveParameters` + `curvePointAtParam`)→\n * 投影到相机平面(正交投影,坐标 = 相对 camera.origin 在 xAxis/yAxis 上的分量);\n * - 序列化为一个完整 SVG:可见轮廓实线 + 隐藏线虚线(stroke-dasharray)。\n *\n * 返回字符串绕开 arg-spec 对 projectEdges/makeProjectedEdges 的 skip 障碍\n * (Edge 句柄数组 + compound 生命周期无法静态收养——本 op 只在内部消费,\n * 产物是 2D 纯文本,无收养问题)。\n *\n * 2026-09-25 core-decouple wrapup(§3.1 A 案):不再依赖 brepjs 的 HLR+2D\n * drawing 链——HLR 由 core 引擎原生提供(occt-wasm projectEdges),2D SVG\n * 序列化为本地实现(曲线边以采样折线近似)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { brepOf } from '../../shape'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { resolveCamera, type ViewSpec } from './view-camera'\n\n/** 投影相机(与 view-camera 输出同构)。 */\ninterface Camera {\n readonly position: [number, number, number]\n readonly direction: [number, number, number]\n readonly xAxis: [number, number, number]\n readonly yAxis: [number, number, number]\n}\n\n/** projectView 的序列化选项。 */\nexport interface ProjectViewOptions {\n /** viewBox 四周留白(单位 = 投影平面坐标单位;缺省 1)。 */\n margin?: number\n /** 可见/隐藏线 stroke-width(像素;缺省 1)。 */\n strokeWidth?: number\n /** 隐藏线虚线样式(SVG stroke-dasharray;缺省 '4,4')。 */\n dash?: string\n /** 隐藏线透明度(缺省 0.6)。 */\n hiddenOpacity?: number\n /** 输出 SVG 宽度(缺省 = viewBox 宽度)。 */\n width?: number\n /** 输出 SVG 高度(缺省 = viewBox 高度)。 */\n height?: number\n}\n\n/** 单视图投影的结构化结果(projectSheet 复用)。 */\nexport interface ProjectionSvg {\n /** 完整 SVG 字符串。 */\n svg: string\n /** viewBox 属性值('minX minY w h';可见 ∪ 隐藏线并集 + margin)。 */\n viewBox: string\n /** 各 path d 串:可见实线 / 隐藏虚线。 */\n paths: { visible: string[]; hidden: string[] }\n /** 输出宽度/高度。 */\n width: number\n height: number\n}\n\n/** 每条边的 3D 采样点数(直线 2 点;曲线分段近似)。 */\nconst EDGE_SAMPLES = 5\n\ntype Vec3 = readonly [number, number, number]\n\n/** 3D 点 → 相机平面 2D 坐标。\n *\n * GOTCHA: occt-wasm 的 HLR projectEdges 已把边投影到相机平面,输出坐标 =\n * (沿 xAxis 的水平分量, 沿 cross(direction, xAxis) 的垂直分量, 沿 direction\n * 的深度分量≈0)——不是世界坐标。因此 2D 坐标直接取输出的前两分量,不再做\n * dot 二次投影(否则会把垂直信息读丢——垂直在 p.y 而非 p.z)。\n */\nfunction projectTo2D(p: Vec3, _cam: Camera): [number, number] {\n return [p[0], p[1]]\n}\n\n/** 引擎 projectEdges 的返回结构(occt-wasm:6 组 compound 的 arena id)。 */\ninterface ProjectEdgesResult {\n visibleSharp: number\n visibleSmooth: number\n visibleOutline: number\n hiddenSharp: number\n hiddenSmooth: number\n hiddenOutline: number\n}\n\nconst COMPOUND_KEYS = [\n ['visibleSharp', 'visible'],\n ['visibleSmooth', 'visible'],\n ['visibleOutline', 'visible'],\n ['hiddenSharp', 'hidden'],\n ['hiddenSmooth', 'hidden'],\n ['hiddenOutline', 'hidden'],\n] as const\n\n/**\n * HLR 投影 shape → 可见/隐藏 2D 折线(SVG d 串)。\n * 全部句柄在本函数内释放(compound + 边;输入 shape 不消费)。\n */\nfunction projectPolylines(shape: Shape, view: ViewSpec): { visible: string[]; hidden: string[] } {\n const solid = brepOf(shape) as BrepHandle | undefined\n if (solid === undefined) {\n throw new Error(\n '[faijs/view-projection] E_BREP_ONLY_INPUT: operation requires a BREP-backed shape ' +\n '(mesh-only input cannot be projected)',\n )\n }\n const api = getBrepApi()\n const cam = resolveCamera(view) as unknown as Camera\n const r = api.projectEdges(\n solid,\n { x: cam.position[0], y: cam.position[1], z: cam.position[2] },\n { x: cam.direction[0], y: cam.direction[1], z: cam.direction[2] },\n { x: cam.xAxis[0], y: cam.xAxis[1], z: cam.xAxis[2] },\n true,\n 0.1,\n ) as ProjectEdgesResult\n\n const out: { visible: string[]; hidden: string[] } = { visible: [], hidden: [] }\n const toHandle = (id: number): BrepHandle => id as BrepHandle\n try {\n for (const [key, group] of COMPOUND_KEYS) {\n const compoundId = r[key]\n if (typeof compoundId !== 'number' || compoundId === 0) continue\n const edges = api.getSubShapes(toHandle(compoundId), 'edge')\n for (const edge of edges) {\n const d = edgeToPath(api, edge, cam)\n if (d !== null) out[group].push(d)\n }\n // 释放 compound slot(幂等)\n try {\n api.release(toHandle(compoundId))\n } catch {\n // already released\n }\n }\n } finally {\n void 0\n }\n return out\n}\n\n/** 单条边 → SVG path d 串(3D 曲线采样折线投影到相机平面)。 */\nfunction edgeToPath(api: ReturnType<typeof getBrepApi>, edge: BrepHandle, cam: Camera): string | null {\n let cp\n try {\n cp = api.curveParameters(edge)\n } catch {\n return null // 退化边(如孤立顶点线)无曲线参数\n }\n const { first, last } = cp\n const span = last - first\n const pts: [number, number][] = []\n for (let i = 0; i < EDGE_SAMPLES; i += 1) {\n const t = first + (span * i) / (EDGE_SAMPLES - 1)\n const p = api.curvePointAtParam(edge, t)\n pts.push(projectTo2D([p.x, p.y, p.z], cam))\n }\n if (pts.length < 2) return null\n let d = `M ${pts[0][0].toFixed(4)} ${pts[0][1].toFixed(4)}`\n for (let i = 1; i < pts.length; i += 1) {\n d += ` L ${pts[i][0].toFixed(4)} ${pts[i][1].toFixed(4)}`\n }\n return d\n}\n\n/** 解析 'minX minY w h' 为数值数组。 */\nfunction parseViewBox(vb: string): [number, number, number, number] | undefined {\n const parts = vb.trim().split(/\\s+/).map(Number)\n if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n))) return undefined\n return [parts[0], parts[1], parts[2], parts[3]]\n}\n\n/** 折线点集 bbox → viewBox(统一坐标系;margin 再外扩)。 */\nfunction viewBoxOfPaths(paths: string[], margin: number): string {\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const d of paths) {\n const nums = d.match(/[-+]?\\d*\\.?\\d+(?:[eE][-+]?\\d+)?/g) ?? []\n for (let i = 0; i + 1 < nums.length; i += 2) {\n const x = Number(nums[i])\n const y = Number(nums[i + 1])\n if (!Number.isFinite(x) || !Number.isFinite(y)) continue\n minX = Math.min(minX, x)\n minY = Math.min(minY, y)\n maxX = Math.max(maxX, x)\n maxY = Math.max(maxY, y)\n }\n }\n if (!Number.isFinite(minX)) return '0 0 0 0' // 空投影(如空 shape)\n return `${minX - margin} ${minY - margin} ${maxX - minX + 2 * margin} ${maxY - minY + 2 * margin}`\n}\n\n/**\n * 单视图投影(结构化结果)。\n *\n * @param shape - 待投影的 faijs Shape(必须带 BREP 槽;mesh-only 输入抛 E_BREP_ONLY_INPUT)。\n * @param view - 视图规格(标准视图 / iso / 轴对平面 / 方向对象)。\n * @param opts - 序列化选项。\n * @returns 结构化投影结果(svg/viewBox/paths/尺寸)。\n */\nexport function projectViewSvg(shape: Shape, view: ViewSpec, opts: ProjectViewOptions = {}): ProjectionSvg {\n const { visible: visiblePaths, hidden: hiddenPaths } = projectPolylines(shape, view)\n const margin = opts.margin ?? 1\n const viewBox = viewBoxOfPaths([...visiblePaths, ...hiddenPaths], margin)\n const parsed = parseViewBox(viewBox) ?? [0, 0, 0, 0]\n const width = opts.width ?? parsed[2]\n const height = opts.height ?? parsed[3]\n const strokeWidth = opts.strokeWidth ?? 1\n const dash = opts.dash ?? '4,4'\n const hiddenOpacity = opts.hiddenOpacity ?? 0.6\n const visibleMarkup = visiblePaths\n .map((d) => `<path d=\"${d}\" fill=\"none\" stroke=\"#000\" stroke-width=\"${strokeWidth}\" />`)\n .join('\\n ')\n const hiddenMarkup = hiddenPaths\n .map(\n (d) =>\n `<path d=\"${d}\" fill=\"none\" stroke=\"#000\" stroke-width=\"${strokeWidth}\" stroke-dasharray=\"${dash}\" opacity=\"${hiddenOpacity}\" />`,\n )\n .join('\\n ')\n const svg = [\n `<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${viewBox}\" width=\"${width}\" height=\"${height}\" fill=\"none\" stroke=\"black\" stroke-width=\"0.6%\" vector-effect=\"non-scaling-stroke\">`,\n ` <g stroke=\"#000\" fill=\"none\">`,\n ` ${visibleMarkup}${hiddenMarkup === '' ? '' : `\\n ${hiddenMarkup}`}`,\n ` </g>`,\n `</svg>`,\n ].join('\\n')\n return { svg, viewBox, paths: { visible: visiblePaths, hidden: hiddenPaths }, width, height }\n}\n\n/**\n * 单视图投影 → SVG 线稿字符串(纯数据,不消费/修改 shape;规则 1 下裸调用不消费输入)。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name projectView\n * @returns SVG 字符串(<svg viewBox=\"…\"> + 可见实线 <path> + 隐藏虚线 <path>)。裸调用 cad.projectView(part0, 'front') 不消费 part0(规则 1),part 仍留在 canvas。\n * @param shape - 目标几何(必须有 BREP 槽;mesh-only 抛 E_BREP_ONLY_INPUT)。type:Shape required:true\n * @param view - 视图规格(同 viewCamera:标准视图名 / iso / 轴对平面 / 方向对象)。type:string|{dir,xAxis?} required:true\n * @param opts.strokeWidth - 可见线宽(stroke-width)。type:number 默认 1\n * @param opts.dash - 隐藏线虚线样式(stroke-dasharray)。type:string 默认 '4,4'\n * @param opts.hiddenOpacity - 隐藏线透明度。type:number 默认 0.6\n * @param opts.margin - viewBox 外扩边距。type:number 默认 1\n * @param opts.width - 输出宽度(缺省 = viewBox 宽度)。type:number\n * @param opts.height - 输出高度(缺省 = viewBox 高度)。type:number\n * @example\n * const svg = cad.projectView(part0, 'front')\n * const svg = cad.projectView(part0, 'iso', { strokeWidth: 1, dash: '4,4', hiddenOpacity: 0.6 })\n */\nexport function projectView(shape: Shape, view: ViewSpec, opts?: ProjectViewOptions): string {\n return projectViewSvg(shape, view, opts).svg\n}\n"]}
1
+ {"version":3,"file":"view-projection.js","sourceRoot":"","sources":["../../../src/api/view/view-projection.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * view-projection — 单视图投影 → SVG 线稿(faijs 视图投影能力,路径 A)\n *\n * projectView(shape, view, opts?) 返回**纯数据 SVG 字符串**(非 Shape):\n * - 直连 core 引擎的 HLR 投影(`BrepEngineApi.projectEdges`,OCCT\n * HLRBRep 隐线消除):可见 / 隐藏两组边(sharp/smooth/outline compound);\n * - 每组边 → 3D 曲线采样折线(`curveParameters` + `curvePointAtParam`)→\n * 投影到相机平面(正交投影,坐标 = 相对 camera.origin 在 xAxis/yAxis 上的分量);\n * - 序列化为一个完整 SVG:可见轮廓实线 + 隐藏线虚线(stroke-dasharray)。\n *\n * 返回字符串绕开 arg-spec 对 projectEdges/makeProjectedEdges 的 skip 障碍\n * (Edge 句柄数组 + compound 生命周期无法静态收养——本 op 只在内部消费,\n * 产物是 2D 纯文本,无收养问题)。\n *\n * 2026-09-25 core-decouple wrapup(§3.1 A 案):不再依赖 brepjs 的 HLR+2D\n * drawing 链——HLR 由 core 引擎原生提供(occt-wasm projectEdges),2D SVG\n * 序列化为本地实现(曲线边以采样折线近似)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { brepOf } from '../../shape'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { resolveCamera, type ViewSpec } from './view-camera'\n\n/** 投影相机(与 view-camera 输出同构)。 */\ninterface Camera {\n readonly position: [number, number, number]\n readonly direction: [number, number, number]\n readonly xAxis: [number, number, number]\n readonly yAxis: [number, number, number]\n}\n\n/** projectView 的序列化选项。 */\nexport interface ProjectViewOptions {\n /** viewBox 四周留白(单位 = 投影平面坐标单位;缺省 1)。 */\n margin?: number\n /** 可见/隐藏线 stroke-width(像素;缺省 1)。 */\n strokeWidth?: number\n /** 隐藏线虚线样式(SVG stroke-dasharray;缺省 '4,4')。 */\n dash?: string\n /** 隐藏线透明度(缺省 0.6)。 */\n hiddenOpacity?: number\n /** 输出 SVG 宽度(缺省 = viewBox 宽度)。 */\n width?: number\n /** 输出 SVG 高度(缺省 = viewBox 高度)。 */\n height?: number\n}\n\n/** 单视图投影的结构化结果(projectSheet 复用)。 */\nexport interface ProjectionSvg {\n /** 完整 SVG 字符串。 */\n svg: string\n /** viewBox 属性值('minX minY w h';可见 ∪ 隐藏线并集 + margin)。 */\n viewBox: string\n /** 各 path d 串:可见实线 / 隐藏虚线。 */\n paths: { visible: string[]; hidden: string[] }\n /** 输出宽度/高度。 */\n width: number\n height: number\n}\n\n/** 每条边的 3D 采样点数(直线 2 点;曲线分段近似)。 */\nconst EDGE_SAMPLES = 5\n\ntype Vec3 = readonly [number, number, number]\n\n/** 3D 点 → 相机平面 2D 坐标。\n *\n * GOTCHA: occt-wasm 的 HLR projectEdges 已把边投影到相机平面,输出坐标 =\n * (沿 xAxis 的水平分量, 沿 cross(direction, xAxis) 的垂直分量, 沿 direction\n * 的深度分量≈0)——不是世界坐标。因此 2D 坐标直接取输出的前两分量,不再做\n * dot 二次投影(否则会把垂直信息读丢——垂直在 p.y 而非 p.z)。\n */\nfunction projectTo2D(p: Vec3, _cam: Camera): [number, number] {\n return [p[0], p[1]]\n}\n\n/** 引擎 projectEdges 的返回结构(occt-wasm:6 组 compound 的 arena id)。 */\ninterface ProjectEdgesResult {\n visibleSharp: number\n visibleSmooth: number\n visibleOutline: number\n hiddenSharp: number\n hiddenSmooth: number\n hiddenOutline: number\n}\n\nconst COMPOUND_KEYS = [\n ['visibleSharp', 'visible'],\n ['visibleSmooth', 'visible'],\n ['visibleOutline', 'visible'],\n ['hiddenSharp', 'hidden'],\n ['hiddenSmooth', 'hidden'],\n ['hiddenOutline', 'hidden'],\n] as const\n\n/**\n * HLR 投影 shape → 可见/隐藏 2D 折线(SVG d 串)。\n * 全部句柄在本函数内释放(compound + 边;输入 shape 不消费)。\n */\nfunction projectPolylines(shape: Shape, view: ViewSpec): { visible: string[]; hidden: string[] } {\n const solid = brepOf(shape) as BrepHandle | undefined\n if (solid === undefined) {\n throw new Error(\n '[faijs/view-projection] E_BREP_ONLY_INPUT: operation requires a BREP-backed shape ' +\n '(mesh-only input cannot be projected)',\n )\n }\n const api = getBrepApi()\n const cam = resolveCamera(view) as unknown as Camera\n const r = api.projectEdges(\n solid,\n { x: cam.position[0], y: cam.position[1], z: cam.position[2] },\n { x: cam.direction[0], y: cam.direction[1], z: cam.direction[2] },\n { x: cam.xAxis[0], y: cam.xAxis[1], z: cam.xAxis[2] },\n true,\n 0.1,\n ) as ProjectEdgesResult\n\n const out: { visible: string[]; hidden: string[] } = { visible: [], hidden: [] }\n const toHandle = (id: number): BrepHandle => id as BrepHandle\n try {\n for (const [key, group] of COMPOUND_KEYS) {\n const compoundId = r[key]\n if (typeof compoundId !== 'number' || compoundId === 0) continue\n const edges = api.getSubShapes(toHandle(compoundId), 'edge')\n for (const edge of edges) {\n const d = edgeToPath(api, edge, cam)\n if (d !== null) out[group].push(d)\n }\n // 释放 compound slot(幂等)\n try {\n api.release(toHandle(compoundId))\n } catch {\n // already released\n }\n }\n } finally {\n void 0\n }\n return out\n}\n\n/** 单条边 → SVG path d 串(3D 曲线采样折线投影到相机平面)。 */\nfunction edgeToPath(api: ReturnType<typeof getBrepApi>, edge: BrepHandle, cam: Camera): string | null {\n let cp\n try {\n cp = api.curveParameters(edge)\n } catch {\n return null // 退化边(如孤立顶点线)无曲线参数\n }\n const { first, last } = cp\n const span = last - first\n const pts: [number, number][] = []\n for (let i = 0; i < EDGE_SAMPLES; i += 1) {\n const t = first + (span * i) / (EDGE_SAMPLES - 1)\n const p = api.curvePointAtParam(edge, t)\n pts.push(projectTo2D([p.x, p.y, p.z], cam))\n }\n if (pts.length < 2) return null\n let d = `M ${pts[0][0].toFixed(4)} ${pts[0][1].toFixed(4)}`\n for (let i = 1; i < pts.length; i += 1) {\n d += ` L ${pts[i][0].toFixed(4)} ${pts[i][1].toFixed(4)}`\n }\n return d\n}\n\n/** 解析 'minX minY w h' 为数值数组。 */\nfunction parseViewBox(vb: string): [number, number, number, number] | undefined {\n const parts = vb.trim().split(/\\s+/).map(Number)\n if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n))) return undefined\n return [parts[0], parts[1], parts[2], parts[3]]\n}\n\n/** 折线点集 bbox → viewBox(统一坐标系;margin 再外扩)。 */\nfunction viewBoxOfPaths(paths: string[], margin: number): string {\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const d of paths) {\n const nums = d.match(/[-+]?\\d*\\.?\\d+(?:[eE][-+]?\\d+)?/g) ?? []\n for (let i = 0; i + 1 < nums.length; i += 2) {\n const x = Number(nums[i])\n const y = Number(nums[i + 1])\n if (!Number.isFinite(x) || !Number.isFinite(y)) continue\n minX = Math.min(minX, x)\n minY = Math.min(minY, y)\n maxX = Math.max(maxX, x)\n maxY = Math.max(maxY, y)\n }\n }\n if (!Number.isFinite(minX)) return '0 0 0 0' // 空投影(如空 shape)\n return `${minX - margin} ${minY - margin} ${maxX - minX + 2 * margin} ${maxY - minY + 2 * margin}`\n}\n\n/**\n * 单视图投影(结构化结果)。\n *\n * @param shape - 待投影的 faijs Shape(必须带 BREP 槽;mesh-only 输入抛 E_BREP_ONLY_INPUT)。\n * @param view - 视图规格(标准视图 / iso / 轴对平面 / 方向对象)。\n * @param opts - 序列化选项。\n * @returns 结构化投影结果(svg/viewBox/paths/尺寸)。\n */\nexport function projectViewSvg(shape: Shape, view: ViewSpec, opts: ProjectViewOptions = {}): ProjectionSvg {\n const { visible: visiblePaths, hidden: hiddenPaths } = projectPolylines(shape, view)\n const margin = opts.margin ?? 1\n const viewBox = viewBoxOfPaths([...visiblePaths, ...hiddenPaths], margin)\n const parsed = parseViewBox(viewBox) ?? [0, 0, 0, 0]\n const width = opts.width ?? parsed[2]\n const height = opts.height ?? parsed[3]\n const strokeWidth = opts.strokeWidth ?? 1\n const dash = opts.dash ?? '4,4'\n const hiddenOpacity = opts.hiddenOpacity ?? 0.6\n const visibleMarkup = visiblePaths\n .map((d) => `<path d=\"${d}\" fill=\"none\" stroke=\"#000\" stroke-width=\"${strokeWidth}\" />`)\n .join('\\n ')\n const hiddenMarkup = hiddenPaths\n .map(\n (d) =>\n `<path d=\"${d}\" fill=\"none\" stroke=\"#000\" stroke-width=\"${strokeWidth}\" stroke-dasharray=\"${dash}\" opacity=\"${hiddenOpacity}\" />`,\n )\n .join('\\n ')\n const svg = [\n `<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${viewBox}\" width=\"${width}\" height=\"${height}\" fill=\"none\" stroke=\"black\" stroke-width=\"0.6%\" vector-effect=\"non-scaling-stroke\">`,\n ` <g stroke=\"#000\" fill=\"none\">`,\n ` ${visibleMarkup}${hiddenMarkup === '' ? '' : `\\n ${hiddenMarkup}`}`,\n ` </g>`,\n `</svg>`,\n ].join('\\n')\n return { svg, viewBox, paths: { visible: visiblePaths, hidden: hiddenPaths }, width, height }\n}\n\n/**\n * 单视图投影 → SVG 线稿字符串(纯数据,不消费/修改 shape;规则 1 下裸调用不消费输入)。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name projectView\n * @returns SVG 字符串(<svg viewBox=\"…\"> + 可见实线 <path> + 隐藏虚线 <path>)。裸调用 cad.projectView(part0, 'front') 不消费 part0(规则 1),part 仍留在 canvas。\n * @param shape - 目标几何(必须有 BREP 槽;mesh-only 抛 E_BREP_ONLY_INPUT)。type:Shape required:true\n * @param view - 视图规格(同 viewCamera:标准视图名 / iso / 轴对平面 / 方向对象)。type:string|{dir,xAxis?} required:true\n * @param opts.strokeWidth - 可见线宽(stroke-width)。type:number 默认 1\n * @param opts.dash - 隐藏线虚线样式(stroke-dasharray)。type:string 默认 '4,4'\n * @param opts.hiddenOpacity - 隐藏线透明度。type:number 默认 0.6\n * @param opts.margin - viewBox 外扩边距。type:number 默认 1\n * @param opts.width - 输出宽度(缺省 = viewBox 宽度)。type:number\n * @param opts.height - 输出高度(缺省 = viewBox 高度)。type:number\n * @example\n * const svg = cad.projectView(part0, 'front')\n * const svg = cad.projectView(part0, 'iso', { strokeWidth: 1, dash: '4,4', hiddenOpacity: 0.6 })\n */\nexport function projectView(shape: Shape, view: ViewSpec, opts?: ProjectViewOptions): string {\n return projectViewSvg(shape, view, opts).svg\n}\n"]}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * view-sheet — 多视图投影图纸(三视图 + 等轴测组合 SVG,faijs 路径 A)
3
3
  *
4
- * 设计文档:docs/plans/2026-09-10-faijs-view-projection-and-screenshot.md §3.2
5
- *
6
4
  * projectSheet(shape, views, opts?) 把多个单视图投影按网格排布为一个 SVG:
7
5
  * - 每个视图用嵌套 `<svg>`(绝对定位 + 各自 viewBox,preserveAspectRatio 保比例);
8
6
  * - 每个视图可带标签(默认用视图名,如 'front' / 'iso');
@@ -1 +1 @@
1
- {"version":3,"file":"view-sheet.d.ts","sourceRoot":"","sources":["../../../src/api/view/view-sheet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,0BAA0B;AAC1B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,CAAA;IACd,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,yBAAyB;AACzB,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sBAAsB;IACtB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yBAAyB;IACzB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,mBAAmB;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAaD;;;;;;;;;;;;;;;;;;IAkBI;AACJ,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,EAC/B,IAAI,GAAE,mBAAwB,GAC7B,MAAM,CAsDR"}
1
+ {"version":3,"file":"view-sheet.d.ts","sourceRoot":"","sources":["../../../src/api/view/view-sheet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,0BAA0B;AAC1B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,CAAA;IACd,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,yBAAyB;AACzB,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sBAAsB;IACtB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yBAAyB;IACzB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,mBAAmB;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAaD;;;;;;;;;;;;;;;;;;IAkBI;AACJ,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,EAC/B,IAAI,GAAE,mBAAwB,GAC7B,MAAM,CAsDR"}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * view-sheet — 多视图投影图纸(三视图 + 等轴测组合 SVG,faijs 路径 A)
3
3
  *
4
- * 设计文档:docs/plans/2026-09-10-faijs-view-projection-and-screenshot.md §3.2
5
- *
6
4
  * projectSheet(shape, views, opts?) 把多个单视图投影按网格排布为一个 SVG:
7
5
  * - 每个视图用嵌套 `<svg>`(绝对定位 + 各自 viewBox,preserveAspectRatio 保比例);
8
6
  * - 每个视图可带标签(默认用视图名,如 'front' / 'iso');
@@ -1 +1 @@
1
- {"version":3,"file":"view-sheet.js","sourceRoot":"","sources":["../../../src/api/view/view-sheet.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * view-sheet — 多视图投影图纸(三视图 + 等轴测组合 SVG,faijs 路径 A)\n *\n * 设计文档:docs/plans/2026-09-10-faijs-view-projection-and-screenshot.md §3.2\n *\n * projectSheet(shape, views, opts?) 把多个单视图投影按网格排布为一个 SVG:\n * - 每个视图用嵌套 `<svg>`(绝对定位 + 各自 viewBox,preserveAspectRatio 保比例);\n * - 每个视图可带标签(默认用视图名,如 'front' / 'iso');\n * - 布局参数(列数/间距/留白)可调,缺省按 sqrt 自动分列。\n *\n * 典型用法:三视图 + 等轴测工程图纸。\n * const sheet = projectSheet(part, ['front', 'top', 'right', 'iso'])\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { projectViewSvg, type ProjectViewOptions } from './view-projection'\nimport type { ViewSpec } from './view-camera'\n\n/** 单个图纸视图:视图规格 + 可选标签。 */\nexport interface SheetView {\n view: ViewSpec\n /** 视图标签(缺省取视图名/方向描述)。 */\n label?: string\n}\n\n/** projectSheet 布局选项。 */\nexport interface ProjectSheetOptions extends ProjectViewOptions {\n /** 网格列数(缺省 ceil(sqrt(n)))。 */\n cols?: number\n /** 相邻单元格间距(缺省 24)。 */\n gap?: number\n /** 图纸外留白(缺省 24)。 */\n padding?: number\n /** 是否渲染视图标签(缺省 true)。 */\n labels?: boolean\n /** 标签字号(缺省 12)。 */\n labelFontSize?: number\n}\n\nfunction labelOf(item: SheetView): string {\n if (item.label !== undefined) return item.label\n if (typeof item.view === 'string') return item.view\n const [x, y, z] = item.view.dir\n return `${x},${y},${z}`\n}\n\nfunction escapeXml(s: string): string {\n return s.replace(/[<>&'\"]/g, (c) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;', \"'\": '&apos;', '\"': '&quot;' })[c] as string)\n}\n\n/**\n * 多视图投影图纸 → 组合 SVG 字符串(纯数据,不消费/修改 shape)。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name projectSheet\n * @returns SVG 字符串(嵌套 <svg x y width height viewBox preserveAspectRatio> + <text> 标签)。空列表返回空 SVG 不抛错。\n * @param shape - 目标几何(必须有 BREP 槽;mesh-only 抛 E_BREP_ONLY_INPUT)。type:Shape required:true\n * @param views - 视图列表:视图规格字符串,或 { view, label? } 对象(方向对象自动生成 x,y,z 标签)。type:(string|{view,label?})[] required:true\n * @param opts.cols - 网格列数。type:number 默认 2\n * @param opts.gap - 格间距(px)。type:number 默认 30\n * @param opts.labels - 是否渲染 <text> 标签。type:boolean 默认 true\n * @param opts.cellWidth - 每格画布宽度。type:number 默认 400\n * @param opts.cellHeight - 每格画布高度。type:number 默认 300\n * @example\n * const sheet = cad.projectSheet(part0, ['front', 'top', 'right', 'iso'])\n * const sheet = cad.projectSheet(part0, [{ view: 'front', label: '主视图' }], { cols: 2, gap: 40, labels: true })\n */\nexport function projectSheet(\n shape: Shape,\n views: (ViewSpec | SheetView)[],\n opts: ProjectSheetOptions = {},\n): string {\n const items: SheetView[] = views.map((v) =>\n typeof v === 'string' ? { view: v, label: v } : 'view' in v ? v : { view: v },\n )\n if (items.length === 0) {\n return '<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"0\" height=\"0\" />'\n }\n const n = items.length\n const cols = opts.cols ?? Math.ceil(Math.sqrt(n))\n const gap = opts.gap ?? 24\n const padding = opts.padding ?? 24\n const labels = opts.labels !== false\n const labelFontSize = opts.labelFontSize ?? 12\n\n const projections = items.map((it) => ({ ...projectViewSvg(shape, it.view, opts), label: labelOf(it) }))\n const labelPadY = labels ? labelFontSize + 10 : 0\n const cellW = Math.max(...projections.map((p) => p.width))\n const cellH = Math.max(...projections.map((p) => p.height)) + labelPadY\n const rows = Math.ceil(n / cols)\n const totalW = cols * cellW + (cols - 1) * gap + 2 * padding\n const totalH = rows * cellH + (rows - 1) * gap + 2 * padding\n\n const cells: string[] = []\n projections.forEach((p, i) => {\n const col = i % cols\n const row = Math.floor(i / cols)\n const x = padding + col * (cellW + gap)\n const y = padding + row * (cellH + gap)\n const inner = [\n `<svg x=\"${x}\" y=\"${y}\" width=\"${cellW}\" height=\"${p.height}\" viewBox=\"${p.viewBox}\" preserveAspectRatio=\"xMidYMid meet\" fill=\"none\" stroke=\"black\" stroke-width=\"0.6%\" vector-effect=\"non-scaling-stroke\">`,\n ` <g stroke=\"#000\" fill=\"none\">`,\n ]\n for (const d of p.paths.visible) {\n inner.push(` <path d=\"${d}\" fill=\"none\" stroke=\"#000\" stroke-width=\"${opts.strokeWidth ?? 1}\" />`)\n }\n for (const d of p.paths.hidden) {\n inner.push(\n ` <path d=\"${d}\" fill=\"none\" stroke=\"#000\" stroke-width=\"${opts.strokeWidth ?? 1}\" stroke-dasharray=\"${opts.dash ?? '4,4'}\" opacity=\"${opts.hiddenOpacity ?? 0.6}\" />`,\n )\n }\n inner.push(' </g>', `</svg>`)\n if (labels) {\n inner.push(\n `<text x=\"${x + cellW / 2}\" y=\"${y + p.height + labelFontSize}\" text-anchor=\"middle\" font-size=\"${labelFontSize}\" fill=\"#000\">${escapeXml(p.label)}</text>`,\n )\n }\n cells.push(inner.join('\\n'))\n })\n\n return [\n `<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"${totalW}\" height=\"${totalH}\" fill=\"none\" stroke=\"black\" stroke-width=\"0.6%\" vector-effect=\"non-scaling-stroke\">`,\n cells.map((c) => ` ${c}`).join('\\n'),\n `</svg>`,\n ].join('\\n')\n}\n"]}
1
+ {"version":3,"file":"view-sheet.js","sourceRoot":"","sources":["../../../src/api/view/view-sheet.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * view-sheet — 多视图投影图纸(三视图 + 等轴测组合 SVG,faijs 路径 A)\n *\n * projectSheet(shape, views, opts?) 把多个单视图投影按网格排布为一个 SVG:\n * - 每个视图用嵌套 `<svg>`(绝对定位 + 各自 viewBox,preserveAspectRatio 保比例);\n * - 每个视图可带标签(默认用视图名,如 'front' / 'iso');\n * - 布局参数(列数/间距/留白)可调,缺省按 sqrt 自动分列。\n *\n * 典型用法:三视图 + 等轴测工程图纸。\n * const sheet = projectSheet(part, ['front', 'top', 'right', 'iso'])\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { projectViewSvg, type ProjectViewOptions } from './view-projection'\nimport type { ViewSpec } from './view-camera'\n\n/** 单个图纸视图:视图规格 + 可选标签。 */\nexport interface SheetView {\n view: ViewSpec\n /** 视图标签(缺省取视图名/方向描述)。 */\n label?: string\n}\n\n/** projectSheet 布局选项。 */\nexport interface ProjectSheetOptions extends ProjectViewOptions {\n /** 网格列数(缺省 ceil(sqrt(n)))。 */\n cols?: number\n /** 相邻单元格间距(缺省 24)。 */\n gap?: number\n /** 图纸外留白(缺省 24)。 */\n padding?: number\n /** 是否渲染视图标签(缺省 true)。 */\n labels?: boolean\n /** 标签字号(缺省 12)。 */\n labelFontSize?: number\n}\n\nfunction labelOf(item: SheetView): string {\n if (item.label !== undefined) return item.label\n if (typeof item.view === 'string') return item.view\n const [x, y, z] = item.view.dir\n return `${x},${y},${z}`\n}\n\nfunction escapeXml(s: string): string {\n return s.replace(/[<>&'\"]/g, (c) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;', \"'\": '&apos;', '\"': '&quot;' })[c] as string)\n}\n\n/**\n * 多视图投影图纸 → 组合 SVG 字符串(纯数据,不消费/修改 shape)。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name projectSheet\n * @returns SVG 字符串(嵌套 <svg x y width height viewBox preserveAspectRatio> + <text> 标签)。空列表返回空 SVG 不抛错。\n * @param shape - 目标几何(必须有 BREP 槽;mesh-only 抛 E_BREP_ONLY_INPUT)。type:Shape required:true\n * @param views - 视图列表:视图规格字符串,或 { view, label? } 对象(方向对象自动生成 x,y,z 标签)。type:(string|{view,label?})[] required:true\n * @param opts.cols - 网格列数。type:number 默认 2\n * @param opts.gap - 格间距(px)。type:number 默认 30\n * @param opts.labels - 是否渲染 <text> 标签。type:boolean 默认 true\n * @param opts.cellWidth - 每格画布宽度。type:number 默认 400\n * @param opts.cellHeight - 每格画布高度。type:number 默认 300\n * @example\n * const sheet = cad.projectSheet(part0, ['front', 'top', 'right', 'iso'])\n * const sheet = cad.projectSheet(part0, [{ view: 'front', label: '主视图' }], { cols: 2, gap: 40, labels: true })\n */\nexport function projectSheet(\n shape: Shape,\n views: (ViewSpec | SheetView)[],\n opts: ProjectSheetOptions = {},\n): string {\n const items: SheetView[] = views.map((v) =>\n typeof v === 'string' ? { view: v, label: v } : 'view' in v ? v : { view: v },\n )\n if (items.length === 0) {\n return '<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"0\" height=\"0\" />'\n }\n const n = items.length\n const cols = opts.cols ?? Math.ceil(Math.sqrt(n))\n const gap = opts.gap ?? 24\n const padding = opts.padding ?? 24\n const labels = opts.labels !== false\n const labelFontSize = opts.labelFontSize ?? 12\n\n const projections = items.map((it) => ({ ...projectViewSvg(shape, it.view, opts), label: labelOf(it) }))\n const labelPadY = labels ? labelFontSize + 10 : 0\n const cellW = Math.max(...projections.map((p) => p.width))\n const cellH = Math.max(...projections.map((p) => p.height)) + labelPadY\n const rows = Math.ceil(n / cols)\n const totalW = cols * cellW + (cols - 1) * gap + 2 * padding\n const totalH = rows * cellH + (rows - 1) * gap + 2 * padding\n\n const cells: string[] = []\n projections.forEach((p, i) => {\n const col = i % cols\n const row = Math.floor(i / cols)\n const x = padding + col * (cellW + gap)\n const y = padding + row * (cellH + gap)\n const inner = [\n `<svg x=\"${x}\" y=\"${y}\" width=\"${cellW}\" height=\"${p.height}\" viewBox=\"${p.viewBox}\" preserveAspectRatio=\"xMidYMid meet\" fill=\"none\" stroke=\"black\" stroke-width=\"0.6%\" vector-effect=\"non-scaling-stroke\">`,\n ` <g stroke=\"#000\" fill=\"none\">`,\n ]\n for (const d of p.paths.visible) {\n inner.push(` <path d=\"${d}\" fill=\"none\" stroke=\"#000\" stroke-width=\"${opts.strokeWidth ?? 1}\" />`)\n }\n for (const d of p.paths.hidden) {\n inner.push(\n ` <path d=\"${d}\" fill=\"none\" stroke=\"#000\" stroke-width=\"${opts.strokeWidth ?? 1}\" stroke-dasharray=\"${opts.dash ?? '4,4'}\" opacity=\"${opts.hiddenOpacity ?? 0.6}\" />`,\n )\n }\n inner.push(' </g>', `</svg>`)\n if (labels) {\n inner.push(\n `<text x=\"${x + cellW / 2}\" y=\"${y + p.height + labelFontSize}\" text-anchor=\"middle\" font-size=\"${labelFontSize}\" fill=\"#000\">${escapeXml(p.label)}</text>`,\n )\n }\n cells.push(inner.join('\\n'))\n })\n\n return [\n `<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"${totalW}\" height=\"${totalH}\" fill=\"none\" stroke=\"black\" stroke-width=\"0.6%\" vector-effect=\"non-scaling-stroke\">`,\n cells.map((c) => ` ${c}`).join('\\n'),\n `</svg>`,\n ].join('\\n')\n}\n"]}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * api view-export — 视图与导出族(平台 op engines:['occt'],普通函数形态)
3
+ *
4
+ * @platform occt — 4 个光栅/矢量导出(`toSVG` / `toMultiviewSVG` / `toPNG` /
5
+ * `toMultiviewPNG`)直调 occt-wasm 原生同名方法(occt-wasm 5.6.0 有,见
6
+ * `dist/index.d.ts` 的 `OcctKernel`)。这些原生方法**不在** L1 契约
7
+ * `BrepEngineApi` 里(L1 只有导入/导出 STEP/STL,无 HLR→SVG / 光栅输出),因此它们
8
+ * 不能走中立路径,必须声明 `engines: ['occt']` 直调 occt(方案 §3.4.7 校正注——
9
+ * 原 S3 初稿把 toSVG/toMultiviewSVG 标为「中立(扩 projectView/projectSheet)」,
10
+ * 实测 L1 无对应成员,更正为 occt 平台 op)。
11
+ *
12
+ * 为什么不是 `defineOp`:本族返回**字符串 / Uint8Array**(非 Shape)。`defineOp` 的
13
+ * brep 包装(`define-op.ts#wrapBrepOne`)把返回值一律收养为 Shape,装不下文本/字节。
14
+ * 数据型平台 op 走普通函数,是 `api/export-brep.ts` 与 `api/shape-type` 的既定口径。
15
+ *
16
+ * 引擎身份**不能**靠 dispatchPath 门控(普通函数不走那条路)⇒ 按
17
+ * `api/internal/l3-bridge.ts#assertEngineFor` 的既定做法:函数体第一行断言当前引擎,
18
+ * 触碰内核之前报出与 D11-4 同构的 `E_BREP_UNSUPPORTED`,不补桩、不回退。
19
+ * (与 dispatchPath 的差异:`assertEngineFor` **不含** D11-3 的 `brep_mock` 豁免——
20
+ * mock 句柄不是 occt 句柄,放行只会拿到错形状,故这里如实拦截。)
21
+ *
22
+ * 注册:api/api-namespace.ts 手动 import + 进 createApiNamespace 对象;覆盖率扫描器
23
+ * scan-occt-op-coverage.ts 的 PLAN_C2_EXTRA 补 4 个方法名(普通函数不在 defineOp
24
+ * 全集口径内,collectOps 看不见)。
25
+ *
26
+ * §9.5 降级路径(记录在案):一旦 brepkit 的 wasm 面把 HLR/光栅渲染接进 L1 契约且两侧
27
+ * 适配器同时落地,这些函数删掉 assertEngineFor 并改走 `getBrepApi()`,对应方法即从 C2
28
+ * 转入 C1。
29
+ */
30
+ import type { Shape } from '../../mesh/types.js';
31
+ import type { ViewName, SvgViewOptions, PngViewOptions, MultiviewSvgOptions, MultiviewPngOptions } from 'occt-wasm';
32
+ /**
33
+ * 将形状渲染为 SVG 字符串(HLR 隐藏线消除,单命名视图)。
34
+ * @group 视图
35
+ * @inputs 1
36
+ * @async false
37
+ * @qual ok
38
+ * @name toSVG
39
+ * @note 平台 op:仅 occt 引擎(原生 toSVG)。非 occt 引擎执行前报 E_BREP_UNSUPPORTED。
40
+ * @returns string SVG 文本(含命名视图与隐藏边虚线样式)。
41
+ * @param shape - 被渲染的形状。type:Shape required:true
42
+ * @param view - 命名视图(front/top/right/iso 等)。type:string required:false
43
+ * @param options - SVG 渲染选项。type:object required:false
44
+ * @example
45
+ * const svg = cad.toSVG(box, 'iso')
46
+ */
47
+ export declare function toSVG(shape: Shape, view?: ViewName, options?: SvgViewOptions): string;
48
+ /**
49
+ * 将形状渲染为多视图 SVG 图纸(Front/Top/Right/Iso 默认排布,含 gnomons 与尺寸标注)。
50
+ * @group 视图
51
+ * @inputs 1
52
+ * @async false
53
+ * @qual ok
54
+ * @name toMultiviewSVG
55
+ * @note 平台 op:仅 occt 引擎(原生 toMultiviewSVG)。非 occt 引擎执行前报
56
+ * E_BREP_UNSUPPORTED。
57
+ * @returns string 多视图 SVG 文本。
58
+ * @param shape - 被渲染的形状。type:Shape required:true
59
+ * @param options - 多视图渲染选项。type:object required:false
60
+ * @example
61
+ * const sheet = cad.toMultiviewSVG(box)
62
+ */
63
+ export declare function toMultiviewSVG(shape: Shape, options?: MultiviewSvgOptions): string;
64
+ /**
65
+ * 将形状栅格化为 PNG 字节(与 toSVG 同绘制,经 CompressionStream 压缩)。
66
+ * @group 视图
67
+ * @inputs 1
68
+ * @async true
69
+ * @qual ok
70
+ * @name toPNG
71
+ * @note 平台 op:仅 occt 引擎(原生 toPNG,返回 Promise<Uint8Array>)。非 occt 引擎
72
+ * 执行前报 E_BREP_UNSUPPORTED。
73
+ * @returns Promise<Uint8Array> PNG 字节流。
74
+ * @param shape - 被渲染的形状。type:Shape required:true
75
+ * @param view - 命名视图(front/top/right/iso 等)。type:string required:false
76
+ * @param options - PNG 渲染选项。type:object required:false
77
+ * @example
78
+ * const png = await cad.toPNG(box, 'iso')
79
+ */
80
+ export declare function toPNG(shape: Shape, view?: ViewName, options?: PngViewOptions): Promise<Uint8Array>;
81
+ /**
82
+ * 将形状栅格化为多视图 PNG 字节(与 toMultiviewSVG 同绘制)。
83
+ * @group 视图
84
+ * @inputs 1
85
+ * @async true
86
+ * @qual ok
87
+ * @name toMultiviewPNG
88
+ * @note 平台 op:仅 occt 引擎(原生 toMultiviewPNG,返回 Promise<Uint8Array>)。非
89
+ * occt 引擎执行前报 E_BREP_UNSUPPORTED。
90
+ * @returns Promise<Uint8Array> 多视图 PNG 字节流。
91
+ * @param shape - 被渲染的形状。type:Shape required:true
92
+ * @param options - 多视图渲染选项。type:object required:false
93
+ * @example
94
+ * const sheet = await cad.toMultiviewPNG(box)
95
+ */
96
+ export declare function toMultiviewPNG(shape: Shape, options?: MultiviewPngOptions): Promise<Uint8Array>;
97
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/view-export/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAe,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAchI;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,MAAM,CAGrF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAGlF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAGxG;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAGrG"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * api view-export — 视图与导出族(平台 op engines:['occt'],普通函数形态)
3
+ *
4
+ * @platform occt — 4 个光栅/矢量导出(`toSVG` / `toMultiviewSVG` / `toPNG` /
5
+ * `toMultiviewPNG`)直调 occt-wasm 原生同名方法(occt-wasm 5.6.0 有,见
6
+ * `dist/index.d.ts` 的 `OcctKernel`)。这些原生方法**不在** L1 契约
7
+ * `BrepEngineApi` 里(L1 只有导入/导出 STEP/STL,无 HLR→SVG / 光栅输出),因此它们
8
+ * 不能走中立路径,必须声明 `engines: ['occt']` 直调 occt(方案 §3.4.7 校正注——
9
+ * 原 S3 初稿把 toSVG/toMultiviewSVG 标为「中立(扩 projectView/projectSheet)」,
10
+ * 实测 L1 无对应成员,更正为 occt 平台 op)。
11
+ *
12
+ * 为什么不是 `defineOp`:本族返回**字符串 / Uint8Array**(非 Shape)。`defineOp` 的
13
+ * brep 包装(`define-op.ts#wrapBrepOne`)把返回值一律收养为 Shape,装不下文本/字节。
14
+ * 数据型平台 op 走普通函数,是 `api/export-brep.ts` 与 `api/shape-type` 的既定口径。
15
+ *
16
+ * 引擎身份**不能**靠 dispatchPath 门控(普通函数不走那条路)⇒ 按
17
+ * `api/internal/l3-bridge.ts#assertEngineFor` 的既定做法:函数体第一行断言当前引擎,
18
+ * 触碰内核之前报出与 D11-4 同构的 `E_BREP_UNSUPPORTED`,不补桩、不回退。
19
+ * (与 dispatchPath 的差异:`assertEngineFor` **不含** D11-3 的 `brep_mock` 豁免——
20
+ * mock 句柄不是 occt 句柄,放行只会拿到错形状,故这里如实拦截。)
21
+ *
22
+ * 注册:api/api-namespace.ts 手动 import + 进 createApiNamespace 对象;覆盖率扫描器
23
+ * scan-occt-op-coverage.ts 的 PLAN_C2_EXTRA 补 4 个方法名(普通函数不在 defineOp
24
+ * 全集口径内,collectOps 看不见)。
25
+ *
26
+ * §9.5 降级路径(记录在案):一旦 brepkit 的 wasm 面把 HLR/光栅渲染接进 L1 契约且两侧
27
+ * 适配器同时落地,这些函数删掉 assertEngineFor 并改走 `getBrepApi()`,对应方法即从 C2
28
+ * 转入 C1。
29
+ */
30
+ import { brepOf } from '../../shape.js';
31
+ import { getOcctKernel } from '../../occt-kernel/occtKernel.js';
32
+ import { assertEngineFor } from '../internal/l3-bridge.js';
33
+ /** 借出形状的内核句柄;无 BREP 槽(mesh-only)报错。 */
34
+ function occtHandleOf(shape, op) {
35
+ const h = brepOf(shape);
36
+ if (!h) {
37
+ throw new Error(`E_SHAPE_TYPE_NO_BREP: ${op} requires a BREP handle (mesh-only shape has none)`);
38
+ }
39
+ return h;
40
+ }
41
+ /**
42
+ * 将形状渲染为 SVG 字符串(HLR 隐藏线消除,单命名视图)。
43
+ * @group 视图
44
+ * @inputs 1
45
+ * @async false
46
+ * @qual ok
47
+ * @name toSVG
48
+ * @note 平台 op:仅 occt 引擎(原生 toSVG)。非 occt 引擎执行前报 E_BREP_UNSUPPORTED。
49
+ * @returns string SVG 文本(含命名视图与隐藏边虚线样式)。
50
+ * @param shape - 被渲染的形状。type:Shape required:true
51
+ * @param view - 命名视图(front/top/right/iso 等)。type:string required:false
52
+ * @param options - SVG 渲染选项。type:object required:false
53
+ * @example
54
+ * const svg = cad.toSVG(box, 'iso')
55
+ */
56
+ export function toSVG(shape, view, options) {
57
+ assertEngineFor('toSVG', ['occt']);
58
+ return getOcctKernel().toSVG(occtHandleOf(shape, 'toSVG'), view, options);
59
+ }
60
+ /**
61
+ * 将形状渲染为多视图 SVG 图纸(Front/Top/Right/Iso 默认排布,含 gnomons 与尺寸标注)。
62
+ * @group 视图
63
+ * @inputs 1
64
+ * @async false
65
+ * @qual ok
66
+ * @name toMultiviewSVG
67
+ * @note 平台 op:仅 occt 引擎(原生 toMultiviewSVG)。非 occt 引擎执行前报
68
+ * E_BREP_UNSUPPORTED。
69
+ * @returns string 多视图 SVG 文本。
70
+ * @param shape - 被渲染的形状。type:Shape required:true
71
+ * @param options - 多视图渲染选项。type:object required:false
72
+ * @example
73
+ * const sheet = cad.toMultiviewSVG(box)
74
+ */
75
+ export function toMultiviewSVG(shape, options) {
76
+ assertEngineFor('toMultiviewSVG', ['occt']);
77
+ return getOcctKernel().toMultiviewSVG(occtHandleOf(shape, 'toMultiviewSVG'), options);
78
+ }
79
+ /**
80
+ * 将形状栅格化为 PNG 字节(与 toSVG 同绘制,经 CompressionStream 压缩)。
81
+ * @group 视图
82
+ * @inputs 1
83
+ * @async true
84
+ * @qual ok
85
+ * @name toPNG
86
+ * @note 平台 op:仅 occt 引擎(原生 toPNG,返回 Promise<Uint8Array>)。非 occt 引擎
87
+ * 执行前报 E_BREP_UNSUPPORTED。
88
+ * @returns Promise<Uint8Array> PNG 字节流。
89
+ * @param shape - 被渲染的形状。type:Shape required:true
90
+ * @param view - 命名视图(front/top/right/iso 等)。type:string required:false
91
+ * @param options - PNG 渲染选项。type:object required:false
92
+ * @example
93
+ * const png = await cad.toPNG(box, 'iso')
94
+ */
95
+ export async function toPNG(shape, view, options) {
96
+ assertEngineFor('toPNG', ['occt']);
97
+ return getOcctKernel().toPNG(occtHandleOf(shape, 'toPNG'), view, options);
98
+ }
99
+ /**
100
+ * 将形状栅格化为多视图 PNG 字节(与 toMultiviewSVG 同绘制)。
101
+ * @group 视图
102
+ * @inputs 1
103
+ * @async true
104
+ * @qual ok
105
+ * @name toMultiviewPNG
106
+ * @note 平台 op:仅 occt 引擎(原生 toMultiviewPNG,返回 Promise<Uint8Array>)。非
107
+ * occt 引擎执行前报 E_BREP_UNSUPPORTED。
108
+ * @returns Promise<Uint8Array> 多视图 PNG 字节流。
109
+ * @param shape - 被渲染的形状。type:Shape required:true
110
+ * @param options - 多视图渲染选项。type:object required:false
111
+ * @example
112
+ * const sheet = await cad.toMultiviewPNG(box)
113
+ */
114
+ export async function toMultiviewPNG(shape, options) {
115
+ assertEngineFor('toMultiviewPNG', ['occt']);
116
+ return getOcctKernel().toMultiviewPNG(occtHandleOf(shape, 'toMultiviewPNG'), options);
117
+ }
118
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/view-export/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,uCAAuC;AACvC,SAAS,YAAY,CAAC,KAAY,EAAE,EAAU;IAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAuC,CAAA;IAC7D,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,yBAAyB,EAAE,oDAAoD,CAAC,CAAA;IAClG,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,KAAK,CAAC,KAAY,EAAE,IAAe,EAAE,OAAwB;IAC3E,eAAe,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAClC,OAAO,aAAa,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AAC3E,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,OAA6B;IACxE,eAAe,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAC3C,OAAO,aAAa,EAAE,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAA;AACvF,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,KAAY,EAAE,IAAe,EAAE,OAAwB;IACjF,eAAe,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAClC,OAAO,aAAa,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AAC3E,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAY,EAAE,OAA6B;IAC9E,eAAe,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAC3C,OAAO,aAAa,EAAE,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAA;AACvF,CAAC","sourcesContent":["/**\n * api view-export — 视图与导出族(平台 op engines:['occt'],普通函数形态)\n *\n * @platform occt — 4 个光栅/矢量导出(`toSVG` / `toMultiviewSVG` / `toPNG` /\n * `toMultiviewPNG`)直调 occt-wasm 原生同名方法(occt-wasm 5.6.0 有,见\n * `dist/index.d.ts` 的 `OcctKernel`)。这些原生方法**不在** L1 契约\n * `BrepEngineApi` 里(L1 只有导入/导出 STEP/STL,无 HLR→SVG / 光栅输出),因此它们\n * 不能走中立路径,必须声明 `engines: ['occt']` 直调 occt(方案 §3.4.7 校正注——\n * 原 S3 初稿把 toSVG/toMultiviewSVG 标为「中立(扩 projectView/projectSheet)」,\n * 实测 L1 无对应成员,更正为 occt 平台 op)。\n *\n * 为什么不是 `defineOp`:本族返回**字符串 / Uint8Array**(非 Shape)。`defineOp` 的\n * brep 包装(`define-op.ts#wrapBrepOne`)把返回值一律收养为 Shape,装不下文本/字节。\n * 数据型平台 op 走普通函数,是 `api/export-brep.ts` 与 `api/shape-type` 的既定口径。\n *\n * 引擎身份**不能**靠 dispatchPath 门控(普通函数不走那条路)⇒ 按\n * `api/internal/l3-bridge.ts#assertEngineFor` 的既定做法:函数体第一行断言当前引擎,\n * 触碰内核之前报出与 D11-4 同构的 `E_BREP_UNSUPPORTED`,不补桩、不回退。\n * (与 dispatchPath 的差异:`assertEngineFor` **不含** D11-3 的 `brep_mock` 豁免——\n * mock 句柄不是 occt 句柄,放行只会拿到错形状,故这里如实拦截。)\n *\n * 注册:api/api-namespace.ts 手动 import + 进 createApiNamespace 对象;覆盖率扫描器\n * scan-occt-op-coverage.ts 的 PLAN_C2_EXTRA 补 4 个方法名(普通函数不在 defineOp\n * 全集口径内,collectOps 看不见)。\n *\n * §9.5 降级路径(记录在案):一旦 brepkit 的 wasm 面把 HLR/光栅渲染接进 L1 契约且两侧\n * 适配器同时落地,这些函数删掉 assertEngineFor 并改走 `getBrepApi()`,对应方法即从 C2\n * 转入 C1。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport type { ShapeHandle, ViewName, SvgViewOptions, PngViewOptions, MultiviewSvgOptions, MultiviewPngOptions } from 'occt-wasm'\nimport { brepOf } from '../../shape'\nimport { getOcctKernel } from '../../occt-kernel/occtKernel'\nimport { assertEngineFor } from '../internal/l3-bridge'\n\n/** 借出形状的内核句柄;无 BREP 槽(mesh-only)报错。 */\nfunction occtHandleOf(shape: Shape, op: string): ShapeHandle {\n const h = brepOf(shape) as unknown as ShapeHandle | undefined\n if (!h) {\n throw new Error(`E_SHAPE_TYPE_NO_BREP: ${op} requires a BREP handle (mesh-only shape has none)`)\n }\n return h\n}\n\n/**\n * 将形状渲染为 SVG 字符串(HLR 隐藏线消除,单命名视图)。\n * @group 视图\n * @inputs 1\n * @async false\n * @qual ok\n * @name toSVG\n * @note 平台 op:仅 occt 引擎(原生 toSVG)。非 occt 引擎执行前报 E_BREP_UNSUPPORTED。\n * @returns string SVG 文本(含命名视图与隐藏边虚线样式)。\n * @param shape - 被渲染的形状。type:Shape required:true\n * @param view - 命名视图(front/top/right/iso 等)。type:string required:false\n * @param options - SVG 渲染选项。type:object required:false\n * @example\n * const svg = cad.toSVG(box, 'iso')\n */\nexport function toSVG(shape: Shape, view?: ViewName, options?: SvgViewOptions): string {\n assertEngineFor('toSVG', ['occt'])\n return getOcctKernel().toSVG(occtHandleOf(shape, 'toSVG'), view, options)\n}\n\n/**\n * 将形状渲染为多视图 SVG 图纸(Front/Top/Right/Iso 默认排布,含 gnomons 与尺寸标注)。\n * @group 视图\n * @inputs 1\n * @async false\n * @qual ok\n * @name toMultiviewSVG\n * @note 平台 op:仅 occt 引擎(原生 toMultiviewSVG)。非 occt 引擎执行前报\n * E_BREP_UNSUPPORTED。\n * @returns string 多视图 SVG 文本。\n * @param shape - 被渲染的形状。type:Shape required:true\n * @param options - 多视图渲染选项。type:object required:false\n * @example\n * const sheet = cad.toMultiviewSVG(box)\n */\nexport function toMultiviewSVG(shape: Shape, options?: MultiviewSvgOptions): string {\n assertEngineFor('toMultiviewSVG', ['occt'])\n return getOcctKernel().toMultiviewSVG(occtHandleOf(shape, 'toMultiviewSVG'), options)\n}\n\n/**\n * 将形状栅格化为 PNG 字节(与 toSVG 同绘制,经 CompressionStream 压缩)。\n * @group 视图\n * @inputs 1\n * @async true\n * @qual ok\n * @name toPNG\n * @note 平台 op:仅 occt 引擎(原生 toPNG,返回 Promise<Uint8Array>)。非 occt 引擎\n * 执行前报 E_BREP_UNSUPPORTED。\n * @returns Promise<Uint8Array> PNG 字节流。\n * @param shape - 被渲染的形状。type:Shape required:true\n * @param view - 命名视图(front/top/right/iso 等)。type:string required:false\n * @param options - PNG 渲染选项。type:object required:false\n * @example\n * const png = await cad.toPNG(box, 'iso')\n */\nexport async function toPNG(shape: Shape, view?: ViewName, options?: PngViewOptions): Promise<Uint8Array> {\n assertEngineFor('toPNG', ['occt'])\n return getOcctKernel().toPNG(occtHandleOf(shape, 'toPNG'), view, options)\n}\n\n/**\n * 将形状栅格化为多视图 PNG 字节(与 toMultiviewSVG 同绘制)。\n * @group 视图\n * @inputs 1\n * @async true\n * @qual ok\n * @name toMultiviewPNG\n * @note 平台 op:仅 occt 引擎(原生 toMultiviewPNG,返回 Promise<Uint8Array>)。非\n * occt 引擎执行前报 E_BREP_UNSUPPORTED。\n * @returns Promise<Uint8Array> 多视图 PNG 字节流。\n * @param shape - 被渲染的形状。type:Shape required:true\n * @param options - 多视图渲染选项。type:object required:false\n * @example\n * const sheet = await cad.toMultiviewPNG(box)\n */\nexport async function toMultiviewPNG(shape: Shape, options?: MultiviewPngOptions): Promise<Uint8Array> {\n assertEngineFor('toMultiviewPNG', ['occt'])\n return getOcctKernel().toMultiviewPNG(occtHandleOf(shape, 'toMultiviewPNG'), options)\n}\n"]}