@faicad/faijs 0.13.1 → 0.14.1

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 (341) hide show
  1. package/dist/api/api-namespace.d.ts.map +1 -1
  2. package/dist/api/api-namespace.js +30 -4
  3. package/dist/api/api-namespace.js.map +1 -1
  4. package/dist/api/boolean.d.ts +19 -0
  5. package/dist/api/boolean.d.ts.map +1 -1
  6. package/dist/api/boolean.js +51 -10
  7. package/dist/api/boolean.js.map +1 -1
  8. package/dist/api/chamfer.d.ts.map +1 -1
  9. package/dist/api/chamfer.js +8 -7
  10. package/dist/api/chamfer.js.map +1 -1
  11. package/dist/api/compound-geom.d.ts +45 -0
  12. package/dist/api/compound-geom.d.ts.map +1 -0
  13. package/dist/api/compound-geom.js +85 -0
  14. package/dist/api/compound-geom.js.map +1 -0
  15. package/dist/api/compound.d.ts +2 -0
  16. package/dist/api/compound.d.ts.map +1 -1
  17. package/dist/api/compound.js +2 -0
  18. package/dist/api/compound.js.map +1 -1
  19. package/dist/api/copy.d.ts +1 -0
  20. package/dist/api/copy.d.ts.map +1 -1
  21. package/dist/api/copy.js +4 -2
  22. package/dist/api/copy.js.map +1 -1
  23. package/dist/api/edge-ref.d.ts +3 -2
  24. package/dist/api/edge-ref.d.ts.map +1 -1
  25. package/dist/api/edge-ref.js +10 -6
  26. package/dist/api/edge-ref.js.map +1 -1
  27. package/dist/api/engrave.d.ts.map +1 -1
  28. package/dist/api/engrave.js +1 -0
  29. package/dist/api/engrave.js.map +1 -1
  30. package/dist/api/extrude.d.ts.map +1 -1
  31. package/dist/api/extrude.js +131 -3
  32. package/dist/api/extrude.js.map +1 -1
  33. package/dist/api/face-ref.d.ts.map +1 -1
  34. package/dist/api/face-ref.js +7 -4
  35. package/dist/api/face-ref.js.map +1 -1
  36. package/dist/api/fai_drill.d.ts +1 -1
  37. package/dist/api/fai_drill.d.ts.map +1 -1
  38. package/dist/api/fai_drill.js +31 -18
  39. package/dist/api/fai_drill.js.map +1 -1
  40. package/dist/api/fai_extrude.d.ts +1 -1
  41. package/dist/api/fai_extrude.d.ts.map +1 -1
  42. package/dist/api/fai_extrude.js +2 -1
  43. package/dist/api/fai_extrude.js.map +1 -1
  44. package/dist/api/fai_split.d.ts +1 -1
  45. package/dist/api/fai_split.d.ts.map +1 -1
  46. package/dist/api/fai_split.js +2 -1
  47. package/dist/api/fai_split.js.map +1 -1
  48. package/dist/api/fillet.d.ts.map +1 -1
  49. package/dist/api/fillet.js +6 -5
  50. package/dist/api/fillet.js.map +1 -1
  51. package/dist/api/generated/operations.js +16 -16
  52. package/dist/api/generated/operations.js.map +1 -1
  53. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  54. package/dist/api/generated/script-face-manifest.js +0 -1
  55. package/dist/api/generated/script-face-manifest.js.map +1 -1
  56. package/dist/api/generated/script-face.d.ts +1 -4
  57. package/dist/api/generated/script-face.d.ts.map +1 -1
  58. package/dist/api/generated/script-face.js +2 -3
  59. package/dist/api/generated/script-face.js.map +1 -1
  60. package/dist/api/generated/sketching.js +1 -1
  61. package/dist/api/generated/sketching.js.map +1 -1
  62. package/dist/api/generated/topology.d.ts +0 -48
  63. package/dist/api/generated/topology.d.ts.map +1 -1
  64. package/dist/api/generated/topology.js +20 -62
  65. package/dist/api/generated/topology.js.map +1 -1
  66. package/dist/api/import-brep.d.ts +36 -0
  67. package/dist/api/import-brep.d.ts.map +1 -0
  68. package/dist/api/import-brep.js +72 -0
  69. package/dist/api/import-brep.js.map +1 -0
  70. package/dist/api/import-step.d.ts +28 -0
  71. package/dist/api/import-step.d.ts.map +1 -0
  72. package/dist/api/import-step.js +57 -0
  73. package/dist/api/import-step.js.map +1 -0
  74. package/dist/api/index.d.ts +7 -2
  75. package/dist/api/index.d.ts.map +1 -1
  76. package/dist/api/index.js +19 -5
  77. package/dist/api/index.js.map +1 -1
  78. package/dist/api/internal/compat-op.d.ts +2 -0
  79. package/dist/api/internal/compat-op.d.ts.map +1 -1
  80. package/dist/api/internal/compat-op.js +10 -2
  81. package/dist/api/internal/compat-op.js.map +1 -1
  82. package/dist/api/knurl.d.ts.map +1 -1
  83. package/dist/api/knurl.js +1 -0
  84. package/dist/api/knurl.js.map +1 -1
  85. package/dist/api/load.d.ts +3 -1
  86. package/dist/api/load.d.ts.map +1 -1
  87. package/dist/api/load.js +3 -1
  88. package/dist/api/load.js.map +1 -1
  89. package/dist/api/pattern.d.ts +32 -0
  90. package/dist/api/pattern.d.ts.map +1 -0
  91. package/dist/api/pattern.js +121 -0
  92. package/dist/api/pattern.js.map +1 -0
  93. package/dist/api/place.d.ts +35 -0
  94. package/dist/api/place.d.ts.map +1 -0
  95. package/dist/api/place.js +113 -0
  96. package/dist/api/place.js.map +1 -0
  97. package/dist/api/primitives.d.ts.map +1 -1
  98. package/dist/api/primitives.js +10 -3
  99. package/dist/api/primitives.js.map +1 -1
  100. package/dist/api/screw.d.ts.map +1 -1
  101. package/dist/api/screw.js +1 -0
  102. package/dist/api/screw.js.map +1 -1
  103. package/dist/api/sdf.d.ts.map +1 -1
  104. package/dist/api/sdf.js +1 -0
  105. package/dist/api/sdf.js.map +1 -1
  106. package/dist/api/sketch.d.ts.map +1 -1
  107. package/dist/api/sketch.js +1 -0
  108. package/dist/api/sketch.js.map +1 -1
  109. package/dist/api/split.d.ts +31 -0
  110. package/dist/api/split.d.ts.map +1 -0
  111. package/dist/api/split.js +96 -0
  112. package/dist/api/split.js.map +1 -0
  113. package/dist/api/surface/arg-spec.d.ts +9 -0
  114. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  115. package/dist/api/surface/arg-spec.js +49 -30
  116. package/dist/api/surface/arg-spec.js.map +1 -1
  117. package/dist/api/svgExtrude.d.ts.map +1 -1
  118. package/dist/api/svgExtrude.js +1 -0
  119. package/dist/api/svgExtrude.js.map +1 -1
  120. package/dist/api/text.d.ts.map +1 -1
  121. package/dist/api/text.js +1 -0
  122. package/dist/api/text.js.map +1 -1
  123. package/dist/api/topo-resolve.d.ts.map +1 -1
  124. package/dist/api/topo-resolve.js +65 -3
  125. package/dist/api/topo-resolve.js.map +1 -1
  126. package/dist/api/transform.d.ts +4 -0
  127. package/dist/api/transform.d.ts.map +1 -1
  128. package/dist/api/transform.js +44 -12
  129. package/dist/api/transform.js.map +1 -1
  130. package/dist/brep/brep-ops.d.ts +34 -1
  131. package/dist/brep/brep-ops.d.ts.map +1 -1
  132. package/dist/brep/brep-ops.js +62 -22
  133. package/dist/brep/brep-ops.js.map +1 -1
  134. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  135. package/dist/brep/engine/adapters/brep-mock.js +8 -0
  136. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  137. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  138. package/dist/brep/engine/adapters/brepkit.js +6 -1
  139. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  140. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  141. package/dist/brep/engine/adapters/occt.js +24 -1
  142. package/dist/brep/engine/adapters/occt.js.map +1 -1
  143. package/dist/brep/engine/primitives.d.ts +17 -0
  144. package/dist/brep/engine/primitives.d.ts.map +1 -1
  145. package/dist/brep/engine/primitives.js.map +1 -1
  146. package/dist/brep/engine/types.d.ts +49 -6
  147. package/dist/brep/engine/types.d.ts.map +1 -1
  148. package/dist/brep/engine/types.js.map +1 -1
  149. package/dist/brep/export/step.d.ts.map +1 -1
  150. package/dist/brep/export/step.js +6 -1
  151. package/dist/brep/export/step.js.map +1 -1
  152. package/dist/brep/face-evolution.d.ts +78 -8
  153. package/dist/brep/face-evolution.d.ts.map +1 -1
  154. package/dist/brep/face-evolution.js +130 -17
  155. package/dist/brep/face-evolution.js.map +1 -1
  156. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  157. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  158. package/dist/brepkit-kernel/brepkitKernel.js +27 -1
  159. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  160. package/dist/browser.d.ts +0 -2
  161. package/dist/browser.d.ts.map +1 -1
  162. package/dist/browser.js +2 -2
  163. package/dist/browser.js.map +1 -1
  164. package/dist/cad-runtime/admit-compat-lib.d.ts +19 -1
  165. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  166. package/dist/cad-runtime/admit-compat-lib.js +21 -1
  167. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  168. package/dist/cad-runtime/backend-dispatch.d.ts +44 -3
  169. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  170. package/dist/cad-runtime/backend-dispatch.js +46 -3
  171. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  172. package/dist/cad-runtime/browser-lib-loader.d.ts +2 -0
  173. package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
  174. package/dist/cad-runtime/browser-lib-loader.js +9 -1
  175. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  176. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  177. package/dist/cad-runtime/direct-executor.js +14 -4
  178. package/dist/cad-runtime/direct-executor.js.map +1 -1
  179. package/dist/cad-runtime/module-registry.d.ts +3 -1
  180. package/dist/cad-runtime/module-registry.d.ts.map +1 -1
  181. package/dist/cad-runtime/module-registry.js +13 -1
  182. package/dist/cad-runtime/module-registry.js.map +1 -1
  183. package/dist/cad-runtime/ports.d.ts +7 -0
  184. package/dist/cad-runtime/ports.d.ts.map +1 -1
  185. package/dist/cad-runtime/ports.js.map +1 -1
  186. package/dist/cad-runtime/runtime-concurrent-error.d.ts +38 -0
  187. package/dist/cad-runtime/runtime-concurrent-error.d.ts.map +1 -0
  188. package/dist/cad-runtime/runtime-concurrent-error.js +43 -0
  189. package/dist/cad-runtime/runtime-concurrent-error.js.map +1 -0
  190. package/dist/cad-runtime/runtime.d.ts +54 -2
  191. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  192. package/dist/cad-runtime/runtime.js +186 -10
  193. package/dist/cad-runtime/runtime.js.map +1 -1
  194. package/dist/define-op.d.ts +22 -0
  195. package/dist/define-op.d.ts.map +1 -1
  196. package/dist/define-op.js +82 -12
  197. package/dist/define-op.js.map +1 -1
  198. package/dist/fcstd/attachment.d.ts +72 -0
  199. package/dist/fcstd/attachment.d.ts.map +1 -0
  200. package/dist/fcstd/attachment.js +93 -0
  201. package/dist/fcstd/attachment.js.map +1 -0
  202. package/dist/fcstd/build-fai-zip.d.ts +11 -0
  203. package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
  204. package/dist/fcstd/build-fai-zip.js +21 -8
  205. package/dist/fcstd/build-fai-zip.js.map +1 -1
  206. package/dist/fcstd/cli.d.ts +3 -0
  207. package/dist/fcstd/cli.d.ts.map +1 -0
  208. package/dist/fcstd/cli.js +37 -0
  209. package/dist/fcstd/cli.js.map +1 -0
  210. package/dist/fcstd/codegen.d.ts +23 -1
  211. package/dist/fcstd/codegen.d.ts.map +1 -1
  212. package/dist/fcstd/codegen.js +159 -48
  213. package/dist/fcstd/codegen.js.map +1 -1
  214. package/dist/fcstd/container.d.ts +16 -1
  215. package/dist/fcstd/container.d.ts.map +1 -1
  216. package/dist/fcstd/container.js +12 -1
  217. package/dist/fcstd/container.js.map +1 -1
  218. package/dist/fcstd/contour.d.ts +9 -1
  219. package/dist/fcstd/contour.d.ts.map +1 -1
  220. package/dist/fcstd/contour.js +28 -18
  221. package/dist/fcstd/contour.js.map +1 -1
  222. package/dist/fcstd/convert.d.ts +31 -2
  223. package/dist/fcstd/convert.d.ts.map +1 -1
  224. package/dist/fcstd/convert.js +73 -22
  225. package/dist/fcstd/convert.js.map +1 -1
  226. package/dist/fcstd/document.d.ts +8 -1
  227. package/dist/fcstd/document.d.ts.map +1 -1
  228. package/dist/fcstd/document.js +4 -1
  229. package/dist/fcstd/document.js.map +1 -1
  230. package/dist/fcstd/expressions.d.ts +14 -1
  231. package/dist/fcstd/expressions.d.ts.map +1 -1
  232. package/dist/fcstd/expressions.js +11 -1
  233. package/dist/fcstd/expressions.js.map +1 -1
  234. package/dist/fcstd/external-geo.d.ts +27 -2
  235. package/dist/fcstd/external-geo.d.ts.map +1 -1
  236. package/dist/fcstd/external-geo.js +23 -2
  237. package/dist/fcstd/external-geo.js.map +1 -1
  238. package/dist/fcstd/feature-translate.d.ts +85 -3
  239. package/dist/fcstd/feature-translate.d.ts.map +1 -1
  240. package/dist/fcstd/feature-translate.js +189 -9
  241. package/dist/fcstd/feature-translate.js.map +1 -1
  242. package/dist/fcstd/index.d.ts +23 -0
  243. package/dist/fcstd/index.d.ts.map +1 -0
  244. package/dist/fcstd/index.js +19 -0
  245. package/dist/fcstd/index.js.map +1 -0
  246. package/dist/fcstd/placement.d.ts +49 -6
  247. package/dist/fcstd/placement.d.ts.map +1 -1
  248. package/dist/fcstd/placement.js +46 -6
  249. package/dist/fcstd/placement.js.map +1 -1
  250. package/dist/fcstd/planegcs-backend.d.ts +16 -1
  251. package/dist/fcstd/planegcs-backend.d.ts.map +1 -1
  252. package/dist/fcstd/planegcs-backend.js +16 -1
  253. package/dist/fcstd/planegcs-backend.js.map +1 -1
  254. package/dist/fcstd/sketch-parse.d.ts +43 -0
  255. package/dist/fcstd/sketch-parse.d.ts.map +1 -1
  256. package/dist/fcstd/sketch-parse.js +26 -0
  257. package/dist/fcstd/sketch-parse.js.map +1 -1
  258. package/dist/fcstd/sketch-solver.d.ts +20 -2
  259. package/dist/fcstd/sketch-solver.d.ts.map +1 -1
  260. package/dist/fcstd/sketch-solver.js +6 -1
  261. package/dist/fcstd/sketch-solver.js.map +1 -1
  262. package/dist/fcstd/sketch-verify.d.ts +19 -1
  263. package/dist/fcstd/sketch-verify.d.ts.map +1 -1
  264. package/dist/fcstd/sketch-verify.js +14 -1
  265. package/dist/fcstd/sketch-verify.js.map +1 -1
  266. package/dist/fcstd/structural-types.d.ts +83 -0
  267. package/dist/fcstd/structural-types.d.ts.map +1 -0
  268. package/dist/fcstd/structural-types.js +116 -0
  269. package/dist/fcstd/structural-types.js.map +1 -0
  270. package/dist/fcstd/unpack.d.ts +21 -2
  271. package/dist/fcstd/unpack.d.ts.map +1 -1
  272. package/dist/fcstd/unpack.js +11 -2
  273. package/dist/fcstd/unpack.js.map +1 -1
  274. package/dist/fcstd-convert.d.ts +30 -0
  275. package/dist/fcstd-convert.d.ts.map +1 -0
  276. package/dist/fcstd-convert.js +27 -0
  277. package/dist/fcstd-convert.js.map +1 -0
  278. package/dist/index.d.ts +1 -0
  279. package/dist/index.d.ts.map +1 -1
  280. package/dist/index.js.map +1 -1
  281. package/dist/lang/determinism-scanner.d.ts +62 -0
  282. package/dist/lang/determinism-scanner.d.ts.map +1 -0
  283. package/dist/lang/determinism-scanner.js +619 -0
  284. package/dist/lang/determinism-scanner.js.map +1 -0
  285. package/dist/lang/symbol-table.generated.d.ts +7 -3
  286. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  287. package/dist/lang/symbol-table.generated.js +7 -3
  288. package/dist/lang/symbol-table.generated.js.map +1 -1
  289. package/dist/mesh/index.d.ts.map +1 -1
  290. package/dist/mesh/index.js +3 -2
  291. package/dist/mesh/index.js.map +1 -1
  292. package/dist/node-host/cli.d.ts.map +1 -1
  293. package/dist/node-host/cli.js +56 -2
  294. package/dist/node-host/cli.js.map +1 -1
  295. package/dist/runtime-state.d.ts +18 -6
  296. package/dist/runtime-state.d.ts.map +1 -1
  297. package/dist/runtime-state.js +9 -1
  298. package/dist/runtime-state.js.map +1 -1
  299. package/dist/shape.d.ts +15 -0
  300. package/dist/shape.d.ts.map +1 -1
  301. package/dist/shape.js +26 -3
  302. package/dist/shape.js.map +1 -1
  303. package/dist/topology/naming/build-naming.d.ts +14 -30
  304. package/dist/topology/naming/build-naming.d.ts.map +1 -1
  305. package/dist/topology/naming/build-naming.js +21 -54
  306. package/dist/topology/naming/build-naming.js.map +1 -1
  307. package/dist/topology/naming/capture-topo-ref.d.ts.map +1 -1
  308. package/dist/topology/naming/capture-topo-ref.js +5 -0
  309. package/dist/topology/naming/capture-topo-ref.js.map +1 -1
  310. package/dist/topology/naming/index.d.ts +3 -0
  311. package/dist/topology/naming/index.d.ts.map +1 -1
  312. package/dist/topology/naming/index.js +3 -0
  313. package/dist/topology/naming/index.js.map +1 -1
  314. package/dist/topology/naming/lineage-resolve.d.ts +80 -0
  315. package/dist/topology/naming/lineage-resolve.d.ts.map +1 -0
  316. package/dist/topology/naming/lineage-resolve.js +120 -0
  317. package/dist/topology/naming/lineage-resolve.js.map +1 -0
  318. package/dist/topology/naming/lineage.d.ts +349 -0
  319. package/dist/topology/naming/lineage.d.ts.map +1 -0
  320. package/dist/topology/naming/lineage.js +398 -0
  321. package/dist/topology/naming/lineage.js.map +1 -0
  322. package/dist/topology/naming/migrate.d.ts +41 -0
  323. package/dist/topology/naming/migrate.d.ts.map +1 -0
  324. package/dist/topology/naming/migrate.js +88 -0
  325. package/dist/topology/naming/migrate.js.map +1 -0
  326. package/dist/topology/naming/role-name.d.ts +176 -0
  327. package/dist/topology/naming/role-name.d.ts.map +1 -0
  328. package/dist/topology/naming/role-name.js +344 -0
  329. package/dist/topology/naming/role-name.js.map +1 -0
  330. package/dist/topology/naming/roles.d.ts +20 -22
  331. package/dist/topology/naming/roles.d.ts.map +1 -1
  332. package/dist/topology/naming/roles.js +51 -49
  333. package/dist/topology/naming/roles.js.map +1 -1
  334. package/dist/topology/naming/types.d.ts +65 -18
  335. package/dist/topology/naming/types.d.ts.map +1 -1
  336. package/dist/topology/naming/types.js.map +1 -1
  337. package/dist/weapp.d.ts +22 -0
  338. package/dist/weapp.d.ts.map +1 -0
  339. package/dist/weapp.js +23 -0
  340. package/dist/weapp.js.map +1 -0
  341. package/package.json +18 -5
@@ -1,4 +1,9 @@
1
- /** Extract a Placement from a PropertyPlacement element (or missing → identity). */
1
+ /**
2
+ * Extract a Placement from a PropertyPlacement element (or missing → identity).
3
+ *
4
+ * @param prop - the Placement property (App::PropertyPlacement) or undefined.
5
+ * @returns the parsed placement; identity when `prop` is missing.
6
+ */
2
7
  export function placementOfProp(prop) {
3
8
  const el = prop?.children[0];
4
9
  const a = el?.attributes ?? {};
@@ -7,11 +12,22 @@ export function placementOfProp(prop) {
7
12
  q: [Number(a['Q0'] ?? 0), Number(a['Q1'] ?? 0), Number(a['Q2'] ?? 0), Number(a['Q3'] ?? 1)],
8
13
  };
9
14
  }
10
- /** Convenience: the object's Placement property (identity when absent). */
15
+ /**
16
+ * Convenience: the object's Placement property (identity when absent).
17
+ *
18
+ * @param obj - the FCStd object to read.
19
+ * @returns the object's placement, or identity when it has none.
20
+ */
11
21
  export function placementOf(obj) {
12
22
  return placementOfProp(obj.properties.get('Placement'));
13
23
  }
14
- /** 3×3 row-major rotation matrix from a (x,y,z,w) quaternion. */
24
+ /**
25
+ * 3×3 row-major rotation matrix from a (x,y,z,w) quaternion.
26
+ *
27
+ * @param q - the quaternion in (x, y, z, w) order.
28
+ * @returns the 3×3 row-major rotation matrix (9 entries).
29
+ * @throws when the quaternion has a zero/non-finite norm.
30
+ */
15
31
  export function quatToMatrix(q) {
16
32
  const [x, y, z, w] = q;
17
33
  const n = Math.hypot(x, y, z, w);
@@ -25,13 +41,25 @@ export function quatToMatrix(q) {
25
41
  s * (nx * nz - nw * ny), s * (ny * nz + nw * nx), 1 - s * (nx * nx + ny * ny),
26
42
  ];
27
43
  }
28
- /** Apply placement (rotate then translate) to a point. */
44
+ /**
45
+ * Apply placement (rotate then translate) to a point.
46
+ *
47
+ * @param pl - the placement to apply.
48
+ * @param w - the world-space input point (mm).
49
+ * @returns the transformed point (mm).
50
+ */
29
51
  export function applyPlacement(pl, w) {
30
52
  const m = quatToMatrix(pl.q);
31
53
  const r = (i) => m[i * 3] * w[0] + m[i * 3 + 1] * w[1] + m[i * 3 + 2] * w[2];
32
54
  return [r(0) + pl.p[0], r(1) + pl.p[1], r(2) + pl.p[2]];
33
55
  }
34
- /** Apply the inverse placement (translate back, rotate by conjugate). */
56
+ /**
57
+ * Apply the inverse placement (translate back, rotate by conjugate).
58
+ *
59
+ * @param pl - the placement whose inverse is applied.
60
+ * @param w - the world-space input point (mm).
61
+ * @returns the point mapped into the placement-local frame (mm).
62
+ */
35
63
  export function invertApplyPlacement(pl, w) {
36
64
  const d = [w[0] - pl.p[0], w[1] - pl.p[1], w[2] - pl.p[2]];
37
65
  const inv = { p: [0, 0, 0], q: [-pl.q[0], -pl.q[1], -pl.q[2], pl.q[3]] };
@@ -42,6 +70,9 @@ export function invertApplyPlacement(pl, w) {
42
70
  * `rotateBrep` (brep/brep-ops.ts): THREE.Euler(order 'XYZ'), i.e. the rotation
43
71
  * matrix is RX·RY·RZ (column vectors; Z applied first). Pinned against THREE
44
72
  * itself in placement.test.ts — not from memory.
73
+ *
74
+ * @param q - the quaternion in (x, y, z, w) order.
75
+ * @returns (x, y, z) euler angles in degrees.
45
76
  */
46
77
  export function quatToEulerXYZDeg(q) {
47
78
  const m = quatToMatrix(q);
@@ -57,7 +88,13 @@ export function quatToEulerXYZDeg(q) {
57
88
  const x = Math.atan2(m[3], m[4]);
58
89
  return [(x * 180) / Math.PI, (y * 180) / Math.PI, 0];
59
90
  }
60
- /** True when the placement is (approximately) the identity — no transform needed. */
91
+ /**
92
+ * True when the placement is (approximately) the identity — no transform needed.
93
+ *
94
+ * @param pl - the placement to test.
95
+ * @param eps - tolerance for both translation and quaternion components.
96
+ * @returns true when the placement is within `eps` of identity.
97
+ */
61
98
  export function isIdentityPlacement(pl, eps = 1e-9) {
62
99
  return (Math.abs(pl.p[0]) < eps && Math.abs(pl.p[1]) < eps && Math.abs(pl.p[2]) < eps &&
63
100
  Math.abs(pl.q[0]) < eps && Math.abs(pl.q[1]) < eps && Math.abs(pl.q[2]) < eps &&
@@ -67,6 +104,9 @@ export function isIdentityPlacement(pl, eps = 1e-9) {
67
104
  * M8.3 — orthonormal sketch-plane basis (u, v) from the placement rotation:
68
105
  * u = rotated X axis, v = rotated Y axis, normal = rotated Z. Points on the
69
106
  * sketch plane (z≈0 in local coords) map to global as p·u + q·v.
107
+ *
108
+ * @param pl - the placement whose rotation defines the plane.
109
+ * @returns the rotated X axis (u), Y axis (v) and plane normal (n).
70
110
  */
71
111
  export function planeBasis(pl) {
72
112
  const m = quatToMatrix(pl.q);
@@ -1 +1 @@
1
- {"version":3,"file":"placement.js","sourceRoot":"","sources":["../../src/fcstd/placement.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M8.1 — PropertyPlacement parsing and quaternion math.\n *\n * FCStd stores placements as `<Property name=\"Placement\"\n * type=\"App::PropertyPlacement\"><PropertyPlacement Px=\"..\" Py=\"..\" Pz=\"..\"\n * Q0=\"..\" Q1=\"..\" Q2=\"..\" Q3=\"..\"/></Property>` where (Q0,Q1,Q2,Q3) is the\n * rotation quaternion in (x,y,z,w) order — Q3 is the scalar component\n * (identity = 0,0,0,1; calibrated against FreeCAD sources and pinned by\n * placement.test.ts analytical solutions).\n *\n * AttachmentOffset uses the same nested element shape inside\n * `App::PropertyPlacementSub`-style properties.\n */\nimport type { FcstdObject } from './document.js';\n\nexport interface Placement {\n /** translation (mm) */\n p: [number, number, number];\n /** rotation quaternion (x, y, z, w) */\n q: [number, number, number, number];\n}\n\n/** Extract a Placement from a PropertyPlacement element (or missing → identity). */\nexport function placementOfProp(prop: FcstdObject['properties'] extends Map<string, infer V> ? V | undefined : never): Placement {\n const el = prop?.children[0];\n const a = el?.attributes ?? {};\n return {\n p: [Number(a['Px'] ?? 0), Number(a['Py'] ?? 0), Number(a['Pz'] ?? 0)],\n q: [Number(a['Q0'] ?? 0), Number(a['Q1'] ?? 0), Number(a['Q2'] ?? 0), Number(a['Q3'] ?? 1)],\n };\n}\n\n/** Convenience: the object's Placement property (identity when absent). */\nexport function placementOf(obj: FcstdObject): Placement {\n return placementOfProp(obj.properties.get('Placement'));\n}\n\n/** 3×3 row-major rotation matrix from a (x,y,z,w) quaternion. */\nexport function quatToMatrix(q: [number, number, number, number]): number[] {\n const [x, y, z, w] = q;\n const n = Math.hypot(x, y, z, w);\n if (!Number.isFinite(n) || n === 0) throw new Error(`invalid quaternion norm: ${n}`);\n const nx = x / n, ny = y / n, nz = z / n, nw = w / n;\n const s = 2; // components are already normalized; scale factor is exactly 2\n return [\n 1 - s * (ny * ny + nz * nz), s * (nx * ny - nw * nz), s * (nx * nz + nw * ny),\n s * (nx * ny + nw * nz), 1 - s * (nx * nx + nz * nz), s * (ny * nz - nw * nx),\n s * (nx * nz - nw * ny), s * (ny * nz + nw * nx), 1 - s * (nx * nx + ny * ny),\n ];\n}\n\n/** Apply placement (rotate then translate) to a point. */\nexport function applyPlacement(pl: Placement, w: [number, number, number]): [number, number, number] {\n const m = quatToMatrix(pl.q);\n const r = (i: number): number => m[i * 3]! * w[0] + m[i * 3 + 1]! * w[1] + m[i * 3 + 2]! * w[2];\n return [r(0) + pl.p[0], r(1) + pl.p[1], r(2) + pl.p[2]];\n}\n\n/** Apply the inverse placement (translate back, rotate by conjugate). */\nexport function invertApplyPlacement(pl: Placement, w: [number, number, number]): [number, number, number] {\n const d: [number, number, number] = [w[0] - pl.p[0], w[1] - pl.p[1], w[2] - pl.p[2]];\n const inv: Placement = { p: [0, 0, 0], q: [-pl.q[0], -pl.q[1], -pl.q[2], pl.q[3]] };\n return applyPlacement(inv, d);\n}\n\n/**\n * M8.3 — quaternion → XYZ euler angles in DEGREES, matching the convention of\n * `rotateBrep` (brep/brep-ops.ts): THREE.Euler(order 'XYZ'), i.e. the rotation\n * matrix is RX·RY·RZ (column vectors; Z applied first). Pinned against THREE\n * itself in placement.test.ts — not from memory.\n */\nexport function quatToEulerXYZDeg(q: [number, number, number, number]): [number, number, number] {\n const m = quatToMatrix(q);\n // M = RX·RY·RZ (row-major 3×3): m[2] = +sinY, m[5] = -sinX·cosY, m[8] = cosX·cosY\n const sy = m[2]!;\n const y = Math.asin(Math.max(-1, Math.min(1, sy)));\n if (Math.abs(sy) < 1 - 1e-9) {\n const x = Math.atan2(-m[5]!, m[8]!);\n const z = Math.atan2(-m[1]!, m[0]!);\n return [(x * 180) / Math.PI, (y * 180) / Math.PI, (z * 180) / Math.PI];\n }\n // gimbal lock: Y = ±90°, X and Z are coupled — set Z = 0; x from m[3]/m[4]\n const x = Math.atan2(m[3]!, m[4]!);\n return [(x * 180) / Math.PI, (y * 180) / Math.PI, 0];\n}\n\n/** True when the placement is (approximately) the identity — no transform needed. */\nexport function isIdentityPlacement(pl: Placement, eps = 1e-9): boolean {\n return (\n Math.abs(pl.p[0]) < eps && Math.abs(pl.p[1]) < eps && Math.abs(pl.p[2]) < eps &&\n Math.abs(pl.q[0]) < eps && Math.abs(pl.q[1]) < eps && Math.abs(pl.q[2]) < eps &&\n Math.abs(Math.abs(pl.q[3]) - 1) < eps\n );\n}\n\n/**\n * M8.3 — orthonormal sketch-plane basis (u, v) from the placement rotation:\n * u = rotated X axis, v = rotated Y axis, normal = rotated Z. Points on the\n * sketch plane (z≈0 in local coords) map to global as p·u + q·v.\n */\nexport function planeBasis(pl: Placement): { u: [number, number, number]; v: [number, number, number]; n: [number, number, number] } {\n const m = quatToMatrix(pl.q);\n // column i of the matrix = image of the i-th basis vector\n const col = (i: number): [number, number, number] => [m[i]!, m[i + 3]!, m[i + 6]!];\n return { u: col(0), v: col(1), n: col(2) };\n}\n"]}
1
+ {"version":3,"file":"placement.js","sourceRoot":"","sources":["../../src/fcstd/placement.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M8.1 — PropertyPlacement parsing and quaternion math.\n *\n * FCStd stores placements as `<Property name=\"Placement\"\n * type=\"App::PropertyPlacement\"><PropertyPlacement Px=\"..\" Py=\"..\" Pz=\"..\"\n * Q0=\"..\" Q1=\"..\" Q2=\"..\" Q3=\"..\"/></Property>` where (Q0,Q1,Q2,Q3) is the\n * rotation quaternion in (x,y,z,w) order — Q3 is the scalar component\n * (identity = 0,0,0,1; calibrated against FreeCAD sources and pinned by\n * placement.test.ts analytical solutions).\n *\n * AttachmentOffset uses the same nested element shape inside\n * `App::PropertyPlacementSub`-style properties.\n */\nimport type { FcstdObject } from './document.js';\n\n/**\n * A placement: translation plus rotation quaternion (x, y, z, w).\n */\nexport interface Placement {\n /** translation (mm) */\n p: [number, number, number];\n /** rotation quaternion (x, y, z, w) */\n q: [number, number, number, number];\n}\n\n/**\n * Extract a Placement from a PropertyPlacement element (or missing → identity).\n *\n * @param prop - the Placement property (App::PropertyPlacement) or undefined.\n * @returns the parsed placement; identity when `prop` is missing.\n */\nexport function placementOfProp(prop: FcstdObject['properties'] extends Map<string, infer V> ? V | undefined : never): Placement {\n const el = prop?.children[0];\n const a = el?.attributes ?? {};\n return {\n p: [Number(a['Px'] ?? 0), Number(a['Py'] ?? 0), Number(a['Pz'] ?? 0)],\n q: [Number(a['Q0'] ?? 0), Number(a['Q1'] ?? 0), Number(a['Q2'] ?? 0), Number(a['Q3'] ?? 1)],\n };\n}\n\n/**\n * Convenience: the object's Placement property (identity when absent).\n *\n * @param obj - the FCStd object to read.\n * @returns the object's placement, or identity when it has none.\n */\nexport function placementOf(obj: FcstdObject): Placement {\n return placementOfProp(obj.properties.get('Placement'));\n}\n\n/**\n * 3×3 row-major rotation matrix from a (x,y,z,w) quaternion.\n *\n * @param q - the quaternion in (x, y, z, w) order.\n * @returns the 3×3 row-major rotation matrix (9 entries).\n * @throws when the quaternion has a zero/non-finite norm.\n */\nexport function quatToMatrix(q: [number, number, number, number]): number[] {\n const [x, y, z, w] = q;\n const n = Math.hypot(x, y, z, w);\n if (!Number.isFinite(n) || n === 0) throw new Error(`invalid quaternion norm: ${n}`);\n const nx = x / n, ny = y / n, nz = z / n, nw = w / n;\n const s = 2; // components are already normalized; scale factor is exactly 2\n return [\n 1 - s * (ny * ny + nz * nz), s * (nx * ny - nw * nz), s * (nx * nz + nw * ny),\n s * (nx * ny + nw * nz), 1 - s * (nx * nx + nz * nz), s * (ny * nz - nw * nx),\n s * (nx * nz - nw * ny), s * (ny * nz + nw * nx), 1 - s * (nx * nx + ny * ny),\n ];\n}\n\n/**\n * Apply placement (rotate then translate) to a point.\n *\n * @param pl - the placement to apply.\n * @param w - the world-space input point (mm).\n * @returns the transformed point (mm).\n */\nexport function applyPlacement(pl: Placement, w: [number, number, number]): [number, number, number] {\n const m = quatToMatrix(pl.q);\n const r = (i: number): number => m[i * 3]! * w[0] + m[i * 3 + 1]! * w[1] + m[i * 3 + 2]! * w[2];\n return [r(0) + pl.p[0], r(1) + pl.p[1], r(2) + pl.p[2]];\n}\n\n/**\n * Apply the inverse placement (translate back, rotate by conjugate).\n *\n * @param pl - the placement whose inverse is applied.\n * @param w - the world-space input point (mm).\n * @returns the point mapped into the placement-local frame (mm).\n */\nexport function invertApplyPlacement(pl: Placement, w: [number, number, number]): [number, number, number] {\n const d: [number, number, number] = [w[0] - pl.p[0], w[1] - pl.p[1], w[2] - pl.p[2]];\n const inv: Placement = { p: [0, 0, 0], q: [-pl.q[0], -pl.q[1], -pl.q[2], pl.q[3]] };\n return applyPlacement(inv, d);\n}\n\n/**\n * M8.3 — quaternion → XYZ euler angles in DEGREES, matching the convention of\n * `rotateBrep` (brep/brep-ops.ts): THREE.Euler(order 'XYZ'), i.e. the rotation\n * matrix is RX·RY·RZ (column vectors; Z applied first). Pinned against THREE\n * itself in placement.test.ts — not from memory.\n *\n * @param q - the quaternion in (x, y, z, w) order.\n * @returns (x, y, z) euler angles in degrees.\n */\nexport function quatToEulerXYZDeg(q: [number, number, number, number]): [number, number, number] {\n const m = quatToMatrix(q);\n // M = RX·RY·RZ (row-major 3×3): m[2] = +sinY, m[5] = -sinX·cosY, m[8] = cosX·cosY\n const sy = m[2]!;\n const y = Math.asin(Math.max(-1, Math.min(1, sy)));\n if (Math.abs(sy) < 1 - 1e-9) {\n const x = Math.atan2(-m[5]!, m[8]!);\n const z = Math.atan2(-m[1]!, m[0]!);\n return [(x * 180) / Math.PI, (y * 180) / Math.PI, (z * 180) / Math.PI];\n }\n // gimbal lock: Y = ±90°, X and Z are coupled — set Z = 0; x from m[3]/m[4]\n const x = Math.atan2(m[3]!, m[4]!);\n return [(x * 180) / Math.PI, (y * 180) / Math.PI, 0];\n}\n\n/**\n * True when the placement is (approximately) the identity — no transform needed.\n *\n * @param pl - the placement to test.\n * @param eps - tolerance for both translation and quaternion components.\n * @returns true when the placement is within `eps` of identity.\n */\nexport function isIdentityPlacement(pl: Placement, eps = 1e-9): boolean {\n return (\n Math.abs(pl.p[0]) < eps && Math.abs(pl.p[1]) < eps && Math.abs(pl.p[2]) < eps &&\n Math.abs(pl.q[0]) < eps && Math.abs(pl.q[1]) < eps && Math.abs(pl.q[2]) < eps &&\n Math.abs(Math.abs(pl.q[3]) - 1) < eps\n );\n}\n\n/**\n * M8.3 — orthonormal sketch-plane basis (u, v) from the placement rotation:\n * u = rotated X axis, v = rotated Y axis, normal = rotated Z. Points on the\n * sketch plane (z≈0 in local coords) map to global as p·u + q·v.\n *\n * @param pl - the placement whose rotation defines the plane.\n * @returns the rotated X axis (u), Y axis (v) and plane normal (n).\n */\nexport function planeBasis(pl: Placement): { u: [number, number, number]; v: [number, number, number]; n: [number, number, number] } {\n const m = quatToMatrix(pl.q);\n // column i of the matrix = image of the i-th basis vector\n const col = (i: number): [number, number, number] => [m[i]!, m[i + 3]!, m[i + 6]!];\n return { u: col(0), v: col(1), n: col(2) };\n}\n"]}
@@ -1,9 +1,24 @@
1
1
  import type { GcsWrapper } from '@salusoft89/planegcs';
2
- import { type Result } from '../vendored/brepjs/core/result.js';
2
+ import { type Result } from '../api/result.js';
3
3
  import type { SketchGeom, SketchCon } from './sketch-parse.js';
4
4
  import type { SolveOutcome, SketchSolver } from './sketch-solver.js';
5
+ /**
6
+ * Resolve the planegcs WASM binary path from the installed package.
7
+ *
8
+ * @returns the absolute path of `planegcs.wasm` inside `@salusoft89/planegcs`.
9
+ */
5
10
  export declare function planegcsWasmPath(): string;
11
+ /**
12
+ * Instantiate the planegcs WASM solver.
13
+ *
14
+ * @returns a `SketchSolver` backed by the planegcs WASM module.
15
+ */
6
16
  export declare function createPlanegcsSolver(): Promise<SketchSolver>;
17
+ /**
18
+ * planegcs WASM implementation of the `SketchSolver` interface (M3.2–M3.4):
19
+ * pushes geometry/constraints into the GCS, solves, and pulls the solved
20
+ * parameters back into `SketchGeom` values.
21
+ */
7
22
  export declare class PlanegcsSolver implements SketchSolver {
8
23
  private wrapper;
9
24
  constructor(wrapper: GcsWrapper);
@@ -1 +1 @@
1
- {"version":3,"file":"planegcs-backend.d.ts","sourceRoot":"","sources":["../../src/fcstd/planegcs-backend.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQrE,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,YAAY,CAAC,CAGlE;AAOD,qBAAa,cAAe,YAAW,YAAY;IACrC,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,UAAU;IAEjC,KAAK,CACT,KAAK,EAAE,UAAU,EAAE,EACnB,WAAW,EAAE,SAAS,EAAE,EACxB,QAAQ,CAAC,EAAE,OAAO,oBAAoB,EAAE,gBAAgB,EAAE,GACzD,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IA2MvC,OAAO,CAAC,sBAAsB;IAyR9B,OAAO,CAAC,QAAQ;IAkEhB;;mFAE+E;IAC/E,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,gBAAgB;CAIzB"}
1
+ {"version":3,"file":"planegcs-backend.d.ts","sourceRoot":"","sources":["../../src/fcstd/planegcs-backend.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQrE;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,YAAY,CAAC,CAGlE;AAOD;;;;GAIG;AACH,qBAAa,cAAe,YAAW,YAAY;IACrC,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,UAAU;IAEjC,KAAK,CACT,KAAK,EAAE,UAAU,EAAE,EACnB,WAAW,EAAE,SAAS,EAAE,EACxB,QAAQ,CAAC,EAAE,OAAO,oBAAoB,EAAE,gBAAgB,EAAE,GACzD,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IA2MvC,OAAO,CAAC,sBAAsB;IAyR9B,OAAO,CAAC,QAAQ;IAkEhB;;mFAE+E;IAC/E,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,gBAAgB;CAIzB"}
@@ -9,13 +9,18 @@
9
9
  * caller can compare against on-disk coordinates (D2).
10
10
  */
11
11
  import { make_gcs_wrapper, Algorithm } from '@salusoft89/planegcs';
12
- import { ok } from '../vendored/brepjs/core/result.js';
12
+ import { ok } from '../api/result.js';
13
13
  import { ConstraintType, PointPos } from './sketch-parse.js';
14
14
  import { SUPPORTED_CONSTRAINT_TYPES } from './sketch-solver.js';
15
15
  import { createRequire } from 'node:module';
16
16
  import { dirname, join } from 'node:path';
17
17
  const require = createRequire(import.meta.url);
18
18
  let wasmPathCache;
19
+ /**
20
+ * Resolve the planegcs WASM binary path from the installed package.
21
+ *
22
+ * @returns the absolute path of `planegcs.wasm` inside `@salusoft89/planegcs`.
23
+ */
19
24
  export function planegcsWasmPath() {
20
25
  if (!wasmPathCache) {
21
26
  const pkgDir = dirname(require.resolve('@salusoft89/planegcs/package.json'));
@@ -23,11 +28,21 @@ export function planegcsWasmPath() {
23
28
  }
24
29
  return wasmPathCache;
25
30
  }
31
+ /**
32
+ * Instantiate the planegcs WASM solver.
33
+ *
34
+ * @returns a `SketchSolver` backed by the planegcs WASM module.
35
+ */
26
36
  export async function createPlanegcsSolver() {
27
37
  const wrapper = await make_gcs_wrapper(planegcsWasmPath());
28
38
  return new PlanegcsSolver(wrapper);
29
39
  }
30
40
  const P = (geoId, pos) => `g${geoId}p${pos}`;
41
+ /**
42
+ * planegcs WASM implementation of the `SketchSolver` interface (M3.2–M3.4):
43
+ * pushes geometry/constraints into the GCS, solves, and pulls the solved
44
+ * parameters back into `SketchGeom` values.
45
+ */
31
46
  export class PlanegcsSolver {
32
47
  wrapper;
33
48
  constructor(wrapper) {
@@ -1 +1 @@
1
- {"version":3,"file":"planegcs-backend.js","sourceRoot":"","sources":["../../src/fcstd/planegcs-backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M3.2/M3.3/M3.4 — planegcs WASM backend for the SketchSolver interface.\n *\n * M3.3: geometry → GCS primitives, including the implicit fixed RtPnt/HAxis/\n * VAxis (geoId -1/-2, plan §5.4). External geometry (geoId <= -3) is rejected\n * upstream (D4: whole sketch downgrades to L2).\n * M3.4: constraints → GCS primitives for the P0 set (plan §7 M3.4).\n * M3.5 helper: solved params are pulled back and geometry rebuilt, so the\n * caller can compare against on-disk coordinates (D2).\n */\nimport { make_gcs_wrapper, Algorithm } from '@salusoft89/planegcs';\nimport type { GcsWrapper } from '@salusoft89/planegcs';\nimport { ok, type Result } from '../vendored/brepjs/core/result.js';\nimport type { SketchGeom, SketchCon } from './sketch-parse.js';\nimport { ConstraintType, PointPos } from './sketch-parse.js';\nimport type { SolveOutcome, SketchSolver } from './sketch-solver.js';\nimport { SUPPORTED_CONSTRAINT_TYPES } from './sketch-solver.js';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\n\nconst require = createRequire(import.meta.url);\n\nlet wasmPathCache: string | undefined;\nexport function planegcsWasmPath(): string {\n if (!wasmPathCache) {\n const pkgDir = dirname(require.resolve('@salusoft89/planegcs/package.json'));\n wasmPathCache = join(pkgDir, 'dist', 'planegcs_dist', 'planegcs.wasm');\n }\n return wasmPathCache;\n}\n\nexport async function createPlanegcsSolver(): Promise<SketchSolver> {\n const wrapper = await make_gcs_wrapper(planegcsWasmPath());\n return new PlanegcsSolver(wrapper);\n}\n\n/** Internal identity for a GCS point owned by a geometry element. */\ntype PtKey = string;\n\nconst P = (geoId: number, pos: number): PtKey => `g${geoId}p${pos}`;\n\nexport class PlanegcsSolver implements SketchSolver {\n constructor(private wrapper: GcsWrapper) {}\n\n async solve(\n geoms: SketchGeom[],\n constraints: SketchCon[],\n external?: import('./sketch-solver.js').ExternalFixedSeg[],\n ): Promise<Result<SolveOutcome, never>> {\n const externalMap = new Map<number, import('./sketch-solver.js').ExternalFixedSeg>(\n (external ?? []).map((e) => [e.geoId, e]),\n );\n // a constraint referencing an unresolvable external geoId is dropped\n const unresolvableExternal = new Set<number>();\n for (const c of constraints) {\n for (const r of c.refs) {\n if (r.geoId <= -3 && r.geoId > -2000 && !externalMap.has(r.geoId)) {\n unresolvableExternal.add(c.index);\n }\n }\n }\n const usableConstraints = constraints.filter((c) => !unresolvableExternal.has(c.index));\n\n const unsupported = usableConstraints.find((c) => !SUPPORTED_CONSTRAINT_TYPES.has(c.type));\n if (unsupported) {\n return ok({\n geoms,\n converged: false,\n reason: 'unsupported-constraint',\n problemConstraints: [unsupported.index],\n droppedConstraints: [...unresolvableExternal],\n });\n }\n\n const w = this.wrapper;\n w.clear_data();\n\n // --- M3.3: implicit fixed frame (root point + H/V axes) ---\n w.push_primitive({ type: 'point', id: P(-1, 1), x: 0, y: 0, fixed: true });\n // GOTCHA (probe-sym-min.ts / probe-l1-ablation.ts): FreeCAD models HAxis/\n // VAxis as real Line entries in Geoms (geoId -1/-2), so constraints may\n // reference axis points (pos 1/2) or the axis edge (pos 0) — e.g.\n // DistanceX(line-point, VAxis) fixes an x coordinate. planegcs has no\n // implicit axes, so we materialize both axes as fixed point+line pairs\n // and register them in `lines` (below) so all constraint shapes see them.\n w.push_primitive({ type: 'point', id: P(-1, 2), x: 1, y: 0, fixed: true });\n w.push_primitive({ type: 'point', id: P(-2, 1), x: 0, y: 0, fixed: true });\n w.push_primitive({ type: 'point', id: P(-2, 2), x: 0, y: 1, fixed: true });\n w.push_primitive({ type: 'line', id: 'L-1', p1_id: P(-1, 1), p2_id: P(-1, 2) });\n w.push_primitive({ type: 'line', id: 'L-2', p1_id: P(-2, 1), p2_id: P(-2, 2) });\n\n // --- M6.3: external fixed geometry (geoId -3, -4, ... in link order) ---\n const externalLines = new Map<number, { p1: PtKey; p2: PtKey }>();\n for (const ext of external ?? []) {\n if (ext.polyline.length === 2) {\n // straight segment: two fixed endpoints + fixed line\n const p1 = P(ext.geoId, 1);\n const p2 = P(ext.geoId, 2);\n w.push_primitive({ type: 'point', id: p1, x: ext.polyline[0]![0], y: ext.polyline[0]![1], fixed: true });\n w.push_primitive({ type: 'point', id: p2, x: ext.polyline[1]![0], y: ext.polyline[1]![1], fixed: true });\n w.push_primitive({ type: 'line', id: `X${ext.geoId}`, p1_id: p1, p2_id: p2 });\n externalLines.set(ext.geoId, { p1, p2 });\n } else {\n // multi-point polyline: pin sampled points as fixed point targets\n ext.polyline.forEach((pt, i) => {\n w.push_primitive({\n type: 'point', id: P(ext.geoId, i + 1), x: pt[0], y: pt[1], fixed: true,\n });\n });\n }\n }\n\n // --- M3.3: geometry → primitives ---\n // Track which point keys exist as standalone points vs derived from lines.\n const lines = new Map<number, { p1: PtKey; p2: PtKey }>();\n const arcs = new Map<number, { center: PtKey; start: PtKey; end: PtKey }>();\n const circles = new Map<number, { center: PtKey }>();\n const ellipses = new Map<number, { center: PtKey; focus1: PtKey }>();\n const standalone = new Map<number, PtKey>();\n // implicit axes are first-class lines for constraint resolution (see\n // the GOTCHA block above): geoId -1 = HAxis, -2 = VAxis\n lines.set(-1, { p1: P(-1, 1), p2: P(-1, 2) });\n lines.set(-2, { p1: P(-2, 1), p2: P(-2, 2) });\n\n // pass 1: standalone points that are constraint anchors\n const anchorNeedsStandalone = new Set<string>();\n for (const c of constraints) {\n for (const r of c.refs) {\n if (r.geoId >= 0 && r.pos !== PointPos.none) anchorNeedsStandalone.add(P(r.geoId, r.pos));\n }\n }\n for (const g of geoms) {\n switch (g.kind) {\n case 'point': {\n const id = P(g.index, 1);\n standalone.set(g.index, id);\n w.push_primitive({ type: 'point', id, x: g.x, y: g.y, fixed: false });\n break;\n }\n default:\n break;\n }\n }\n // pass 2: curves; create endpoint points for lines/arcs, center points\n for (const g of geoms) {\n switch (g.kind) {\n case 'line': {\n const p1 = anchorNeedsStandalone.has(P(g.index, 1)) ? P(g.index, 1) : P(g.index, 1);\n const p2 = P(g.index, 2);\n // create endpoint points as real GCS points, then a line over them\n for (const [id, x, y] of [\n [p1, g.x1, g.y1],\n [p2, g.x2, g.y2],\n ] as const) {\n w.push_primitive({ type: 'point', id, x, y, fixed: false });\n }\n w.push_primitive({ type: 'line', id: `L${g.index}`, p1_id: p1, p2_id: p2 });\n lines.set(g.index, { p1, p2 });\n break;\n }\n case 'circle': {\n const c = P(g.index, 3);\n w.push_primitive({ type: 'point', id: c, x: g.cx, y: g.cy, fixed: false });\n w.push_primitive({ type: 'circle', id: `C${g.index}`, c_id: c, radius: g.radius });\n circles.set(g.index, { center: c });\n break;\n }\n case 'arc': {\n const c = P(g.index, 3);\n const s = P(g.index, 1);\n const e = P(g.index, 2);\n for (const [id, x, y] of [\n [c, g.cx, g.cy],\n [s, g.x1, g.y1],\n [e, g.x2, g.y2],\n ] as const) {\n w.push_primitive({ type: 'point', id, x, y, fixed: false });\n }\n w.push_primitive({\n type: 'arc', id: `A${g.index}`, c_id: c, start_id: s, end_id: e,\n start_angle: g.startAngle, end_angle: g.endAngle, radius: g.radius,\n });\n arcs.set(g.index, { center: c, start: s, end: e });\n break;\n }\n case 'ellipse': {\n const c = P(g.index, 3);\n const f1 = P(g.index, 1);\n for (const [id, x, y] of [\n [c, g.cx, g.cy],\n [f1, g.fx1, g.fy1],\n ] as const) {\n w.push_primitive({ type: 'point', id, x, y, fixed: false });\n }\n w.push_primitive({\n type: 'ellipse', id: `E${g.index}`, c_id: c, focus1_id: f1, radmin: g.minorRadius,\n });\n ellipses.set(g.index, { center: c, focus1: f1 });\n break;\n }\n case 'point':\n break; // handled in pass 1\n }\n }\n\n // --- M3.4: constraints → primitives ---\n // A constraint whose GCS shape cannot be pushed is dropped and recorded\n // (D3: no silent loss — surfaced via droppedConstraints).\n const droppedConstraints: number[] = [...unresolvableExternal];\n for (const c of usableConstraints) {\n let prims: Record<string, unknown>[];\n try {\n prims = this.constraintToPrimitives(c, { lines, arcs, circles, ellipses, standalone, externalLines });\n } catch {\n droppedConstraints.push(c.index);\n continue;\n }\n try {\n for (const p of prims) w.push_primitive(p as never);\n } catch {\n droppedConstraints.push(c.index);\n continue;\n }\n }\n\n // --- solve (D2: initial values = on-disk coordinates) ---\n const status = w.solve(Algorithm.LevenbergMarquardt);\n const conflicting = w.has_gcs_conflicting_constraints();\n const redundant = w.has_gcs_redundant_constraints();\n\n if (status !== 0 || conflicting) {\n const problem = conflicting ? w.get_gcs_conflicting_constraints() : w.get_gcs_redundant_constraints();\n const problemConstraints = problem\n .map((s) => Number(s.replace(/^c/, '')))\n .filter((n) => Number.isFinite(n));\n return ok({\n geoms,\n converged: false,\n reason: conflicting ? 'conflicting' : redundant ? 'redundant' : 'failed',\n problemConstraints,\n droppedConstraints,\n });\n }\n\n w.apply_solution();\n\n // --- pull back solved coordinates and rebuild geometry ---\n const solved = this.pullBack(geoms, { lines, arcs, circles, ellipses, standalone });\n return ok({ geoms: solved, converged: true, problemConstraints: [], droppedConstraints });\n }\n\n private constraintToPrimitives(\n c: SketchCon,\n ctx: {\n lines: Map<number, { p1: PtKey; p2: PtKey }>;\n arcs: Map<number, { center: PtKey; start: PtKey; end: PtKey }>;\n circles: Map<number, { center: PtKey }>;\n ellipses: Map<number, { center: PtKey; focus1: PtKey }>;\n standalone: Map<number, PtKey>;\n externalLines: Map<number, { p1: PtKey; p2: PtKey }>;\n },\n ): Record<string, unknown>[] {\n const out: Record<string, unknown>[] = [];\n const id = `c${c.index}`;\n const r = c.refs;\n // guards: old-format fallback may yield < 2 refs for pair constraints\n if (r.length < 1) return out;\n const pt = (ref: { geoId: number; pos: number } | undefined): PtKey | undefined => {\n if (!ref) return undefined;\n if (ref.geoId === -1) return P(-1, 1); // root point\n if (ref.geoId === -2) return P(-2, ref.pos === 0 ? 1 : ref.pos); // VAxis point\n if (ref.geoId <= -3 && ref.geoId > -2000) {\n // M6.3 external geometry: endpoint/point refs onto fixed segments\n const ext = ctx.externalLines.get(ref.geoId);\n if (!ext) return undefined;\n if (ref.pos === 1) return ext.p1;\n if (ref.pos === 2) return ext.p2;\n return undefined; // pos=0 (edge itself) handled by line-typed paths\n }\n if (ref.geoId >= 0) return P(ref.geoId, ref.pos);\n return undefined;\n };\n\n switch (c.type) {\n case ConstraintType.Coincident: {\n const p1 = pt(r[0]!);\n const p2 = pt(r[1]!);\n if (p1 && p2) out.push({ type: 'p2p_coincident', id, p1_id: p1, p2_id: p2 });\n break;\n }\n case ConstraintType.Horizontal: {\n // Horizontal with pos=0 refs is the HAxis case: line horizontal\n if (r[0]!.pos === PointPos.none || r.length >= 1 && r[0]!.pos !== PointPos.mid) {\n if (r.length === 1) {\n // horizontal via axis: geoId is the line itself\n const line = ctx.lines.get(r[0]!.geoId);\n if (line) out.push({ type: 'horizontal_l', id, l_id: line ? `L${r[0]!.geoId}` : '' });\n } else {\n const p1 = pt(r[0]!);\n const p2 = pt(r[1]!);\n if (p1 && p2) out.push({ type: 'horizontal_pp', id, p1_id: p1, p2_id: p2 });\n }\n }\n break;\n }\n case ConstraintType.Vertical: {\n if (r.length === 1) {\n const gid = `L${r[0]!.geoId}`;\n if (ctx.lines.has(r[0]!.geoId)) out.push({ type: 'vertical_l', id, l_id: gid });\n } else {\n const p1 = pt(r[0]!);\n const p2 = pt(r[1]!);\n if (p1 && p2) out.push({ type: 'vertical_pp', id, p1_id: p1, p2_id: p2 });\n }\n break;\n }\n case ConstraintType.Parallel: {\n if (r.length === 2 && ctx.lines.has(r[0]!.geoId) && ctx.lines.has(r[1]!.geoId)) {\n out.push({\n type: 'parallel', id,\n l1_id: `L${r[0]!.geoId}`, l2_id: `L${r[1]!.geoId}`,\n internalalignment: 0,\n });\n }\n break;\n }\n case ConstraintType.Perpendicular: {\n if (r.length === 2 && ctx.lines.has(r[0]!.geoId) && ctx.lines.has(r[1]!.geoId)) {\n out.push({ type: 'perpendicular_ll', id, l1_id: `L${r[0]!.geoId}`, l2_id: `L${r[1]!.geoId}` });\n }\n break;\n }\n case ConstraintType.Distance: {\n // p2p / p2l / p2c / c2c variants by ref shapes.\n // GOTCHA (probe-l1-ablation.ts): a second ref that is an AXIS EDGE\n // (geoId -1/-2, pos=0) is a point-to-LINE distance against the axis\n // (FreeCAD Sketch.cpp addDistanceConstraint(point, line)) — e.g.\n // Distance(p, HAxis) = |y|. Resolving the axis edge to the root point\n // and emitting p2p_distance instead drags the point onto a circle\n // around the origin (taperedballnose collapse, delta 2.3e1).\n const p1 = pt(r[0]!);\n const axisEdgeDist = r.length >= 2 && r[1]!.pos === PointPos.none && (r[1]!.geoId === -1 || r[1]!.geoId === -2);\n if (axisEdgeDist && p1) {\n out.push({ type: 'p2l_distance', id, p_id: p1, l_id: `L${r[1]!.geoId}`, distance: c.value });\n } else if (p1 && r[1] && r[1].pos === PointPos.none && ctx.lines.has(r[1].geoId)) {\n out.push({ type: 'p2l_distance', id, p_id: p1, l_id: `L${r[1]!.geoId}`, distance: c.value });\n } else if (p1 && r[1]) {\n const p2 = pt(r[1]);\n if (p2) out.push({ type: 'p2p_distance', id, p1_id: p1, p2_id: p2, distance: c.value });\n }\n break;\n }\n case ConstraintType.DistanceX: {\n // planegcs 'difference' semantics: param2 - param1 = difference\n // (verified empirically). FCStd DistanceX value = second.x - first.x.\n // GOTCHA (probe-l1-ablation.ts, Sketch.cpp:2053): when the second ref\n // is an AXIS EDGE (geoId -1/-2, pos=0) FreeCAD treats it as GeoUndef —\n // an ABSOLUTE coordinate constraint (coordinate_x), not a difference\n // against the axis point. Mapping it to 'difference' forces x = -value\n // and produced the taperedballnose wrong solution (delta 2.3e1).\n const axisEdge = r.length >= 2 && r[1]!.pos === PointPos.none && (r[1]!.geoId === -1 || r[1]!.geoId === -2);\n const firstIsPoint = r[0]!.pos !== PointPos.none || r[0]!.geoId < 0;\n if (axisEdge && firstIsPoint) {\n const p = pt(r[0]!);\n if (p) out.push({ type: 'coordinate_x', id, p_id: p, x: c.value });\n break;\n }\n const p1 = pt(r[0]!);\n const p2 = pt(r[1]!);\n if (p1 && p2) {\n out.push({\n type: 'difference',\n id,\n param1: { o_id: p1, prop: 'x' },\n param2: { o_id: p2, prop: 'x' },\n difference: c.value,\n });\n }\n break;\n }\n case ConstraintType.DistanceY: {\n // symmetric case to DistanceX: axis-edge second ref → absolute y\n const axisEdge = r.length >= 2 && r[1]!.pos === PointPos.none && (r[1]!.geoId === -1 || r[1]!.geoId === -2);\n const firstIsPoint = r[0]!.pos !== PointPos.none || r[0]!.geoId < 0;\n if (axisEdge && firstIsPoint) {\n const p = pt(r[0]!);\n if (p) out.push({ type: 'coordinate_y', id, p_id: p, y: c.value });\n break;\n }\n const p1 = pt(r[0]!);\n const p2 = pt(r[1]!);\n if (p1 && p2) {\n out.push({\n type: 'difference',\n id,\n param1: { o_id: p1, prop: 'y' },\n param2: { o_id: p2, prop: 'y' },\n difference: c.value,\n });\n }\n break;\n }\n case ConstraintType.Angle: {\n // FreeCAD Sketch.cpp case Angle — 4 shapes by ref count/pos:\n // ① Third != GeoUndef → angle-via-point (not needed by corpus P0 set;\n // dropped explicitly below if encountered)\n // ② SecondPos != none → l2l_angle_pppp (lines with explicit start points:\n // pos==start keeps direction, pos==end swaps the point pair)\n // ③ Second set, both pos none → l2l_angle_ll (line-level)\n // ④ only First → p2p_angle on the line's own points (orientation)\n // refs may carry a Third = -2000 (GeoUndef sentinel) — filter it.\n const refs = r.filter((x) => x.geoId !== -2000);\n if (refs.length >= 3) {\n // ① via-point angle: not in the P0 mapping set — record as dropped\n break;\n }\n if (refs.length === 2) {\n const [a, b] = refs as [{ geoId: number; pos: number }, { geoId: number; pos: number }];\n const lineA = ctx.lines.has(a.geoId);\n const lineB = ctx.lines.has(b.geoId);\n if (lineA && lineB && a.pos !== PointPos.none && b.pos !== PointPos.none) {\n // ② explicit start points; pos=end reverses that line's direction\n const a1 = a.pos === PointPos.start ? P(a.geoId, 1) : P(a.geoId, 2);\n const a2 = a.pos === PointPos.start ? P(a.geoId, 2) : P(a.geoId, 1);\n const b1 = b.pos === PointPos.start ? P(b.geoId, 1) : P(b.geoId, 2);\n const b2 = b.pos === PointPos.start ? P(b.geoId, 2) : P(b.geoId, 1);\n out.push({ type: 'l2l_angle_pppp', id, l1p1_id: a1, l1p2_id: a2, l2p1_id: b1, l2p2_id: b2, angle: c.value });\n } else if (lineA && lineB) {\n // ③ line-level angle\n out.push({\n type: 'l2l_angle_ll', id,\n l1_id: `L${a.geoId}`, l2_id: `L${b.geoId}`,\n angle: c.value,\n internalalignment: 0,\n });\n }\n } else if (refs.length === 1 && ctx.lines.has(refs[0]!.geoId)) {\n // ④ orientation angle of a single line (p2p_angle on its points)\n out.push({ type: 'p2p_angle', id, p1_id: P(refs[0]!.geoId, 1), p2_id: P(refs[0]!.geoId, 2), angle: c.value });\n }\n break;\n }\n case ConstraintType.Radius: {\n if (ctx.circles.has(r[0]!.geoId)) {\n out.push({ type: 'circle_radius', id, c_id: `C${r[0]!.geoId}`, radius: c.value });\n } else if (ctx.arcs.has(r[0]!.geoId)) {\n out.push({ type: 'arc_radius', id, a_id: `A${r[0]!.geoId}`, radius: c.value });\n }\n break;\n }\n case ConstraintType.Diameter: {\n if (ctx.circles.has(r[0]!.geoId)) {\n out.push({ type: 'circle_diameter', id, c_id: `C${r[0]!.geoId}`, diameter: c.value });\n } else if (ctx.arcs.has(r[0]!.geoId)) {\n out.push({ type: 'arc_diameter', id, a_id: `A${r[0]!.geoId}`, diameter: c.value });\n }\n break;\n }\n case ConstraintType.Equal: {\n // equal_length for line pairs; equal_radii for circle/arc pairs\n if (r.length === 2) {\n const g0 = r[0]!.geoId;\n const g1 = r[1]!.geoId;\n if (ctx.lines.has(g0) && ctx.lines.has(g1)) {\n out.push({ type: 'equal_length', id, l1_id: `L${g0}`, l2_id: `L${g1}` });\n } else if ((ctx.circles.has(g0) || ctx.arcs.has(g0)) && (ctx.circles.has(g1) || ctx.arcs.has(g1))) {\n // arcs use their own primitive id (A{n}); circles use C{n}\n const id0 = ctx.circles.has(g0) ? `C${g0}` : `A${g0}`;\n const id1 = ctx.circles.has(g1) ? `C${g1}` : `A${g1}`;\n out.push({ type: 'equal_radius_cc', id, c1_id: id0, c2_id: id1 });\n } else if (ctx.ellipses.has(g0) && ctx.ellipses.has(g1)) {\n out.push({ type: 'equal_radii_ee', id, e1_id: `E${g0}`, e2_id: `E${g1}` });\n }\n }\n break;\n }\n case ConstraintType.PointOnObject: {\n const p = pt(r[0]!);\n if (p && r[1]!.pos === PointPos.none) {\n const onGeoId = r[1]!.geoId;\n if (ctx.lines.has(onGeoId)) {\n out.push({ type: 'point_on_line_pl', id, p_id: p, l_id: `L${onGeoId}` });\n } else if (ctx.externalLines.has(onGeoId)) {\n // M6.3: point-on-external-edge → point_on_line against the fixed line\n out.push({ type: 'point_on_line_pl', id, p_id: p, l_id: `X${onGeoId}` });\n } else if (ctx.circles.has(onGeoId)) {\n out.push({ type: 'point_on_circle', id, p_id: p, c_id: `C${onGeoId}` });\n } else if (ctx.arcs.has(onGeoId)) {\n out.push({ type: 'point_on_arc', id, p_id: p, a_id: `A${onGeoId}` });\n }\n }\n break;\n }\n case ConstraintType.Symmetric: {\n // Symmetric(p1, p2, line) or Symmetric(p1, p2, p3)\n const p1 = pt(r[0]!);\n const p2 = pt(r[1]!);\n if (p1 && p2) {\n if (r.length >= 3 && r[2]!.pos === PointPos.none && ctx.lines.has(r[2]!.geoId)) {\n out.push({ type: 'p2p_symmetric_ppl', id, p1_id: p1, p2_id: p2, l_id: `L${r[2]!.geoId}` });\n } else {\n const p3 = pt(r[2]!);\n if (p3) out.push({ type: 'p2p_symmetric_ppp', id, p1_id: p1, p2_id: p2, p_id: p3 });\n }\n }\n break;\n }\n case ConstraintType.Tangent: {\n // line-circle / circle-circle / line-arc / arc-arc (edge-level, pos=0)\n const a = r[0]!;\n const b = r[1]!;\n if (!a || !b) break;\n const lineA = ctx.lines.has(a.geoId);\n const circA = ctx.circles.has(a.geoId);\n const arcA = ctx.arcs.has(a.geoId);\n const lineB = ctx.lines.has(b.geoId);\n const circB = ctx.circles.has(b.geoId);\n const arcB = ctx.arcs.has(b.geoId);\n if (lineA && circB) out.push({ type: 'tangent_lc', id, l_id: `L${a.geoId}`, c_id: `C${b.geoId}`, internalalignment: 0 });\n else if (circA && lineB) out.push({ type: 'tangent_lc', id, l_id: `L${b.geoId}`, c_id: `C${a.geoId}`, internalalignment: 0 });\n else if (circA && circB) out.push({ type: 'tangent_cc', id, c1_id: `C${a.geoId}`, c2_id: `C${b.geoId}`, internalalignment: 0 });\n else if (lineA && arcB) out.push({ type: 'tangent_la', id, l_id: `L${a.geoId}`, a_id: `A${b.geoId}`, internalalignment: 0 });\n else if (arcA && lineB) out.push({ type: 'tangent_la', id, l_id: `L${b.geoId}`, a_id: `A${a.geoId}`, internalalignment: 0 });\n else if (arcA && arcB) out.push({ type: 'tangent_aa', id, a1_id: `A${a.geoId}`, a2_id: `A${b.geoId}`, internalalignment: 0 });\n break;\n }\n default:\n break; // unsupported types never reach here (guard in solve())\n }\n return out;\n }\n\n private pullBack(\n geoms: SketchGeom[],\n ctx: {\n lines: Map<number, { p1: PtKey; p2: PtKey }>;\n arcs: Map<number, { center: PtKey; start: PtKey; end: PtKey }>;\n circles: Map<number, { center: PtKey }>;\n ellipses: Map<number, { center: PtKey; focus1: PtKey }>;\n standalone: Map<number, PtKey>;\n },\n ): SketchGeom[] {\n // After apply_solution, re-derive geometry from the wrapper's primitive\n // state via pull through the wrapper's sketch index.\n const out: SketchGeom[] = [];\n for (const g of geoms) {\n switch (g.kind) {\n case 'point': {\n const key = ctx.standalone.get(g.index);\n const pt = key ? this.readPoint(key) : undefined;\n out.push(pt ? { ...g, x: pt.x, y: pt.y } : g);\n break;\n }\n case 'line': {\n const l = ctx.lines.get(g.index)!;\n const p1 = this.readPoint(l.p1);\n const p2 = this.readPoint(l.p2);\n out.push(p1 && p2 ? { ...g, x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y } : g);\n break;\n }\n case 'circle': {\n const cc = ctx.circles.get(g.index)!.center;\n const c = this.readPoint(cc);\n const rad = this.readCircleRadius(g.index);\n out.push(c && rad !== undefined ? { ...g, cx: c.x, cy: c.y, radius: rad } : g);\n break;\n }\n case 'arc': {\n const a = ctx.arcs.get(g.index)!;\n const c = this.readPoint(a.center);\n const s = this.readPoint(a.start);\n const e = this.readPoint(a.end);\n if (c && s && e) {\n const r = Math.hypot(s.x - c.x, s.y - c.y);\n const startAngle = Math.atan2(s.y - c.y, s.x - c.x);\n const endAngle = Math.atan2(e.y - c.y, e.x - c.x);\n out.push({ ...g, cx: c.x, cy: c.y, radius: r, startAngle, endAngle, x1: s.x, y1: s.y, x2: e.x, y2: e.y });\n } else out.push(g);\n break;\n }\n case 'ellipse': {\n const el = ctx.ellipses.get(g.index)!;\n const c = this.readPoint(el.center);\n const f1 = this.readPoint(el.focus1);\n if (c && f1) {\n const major = Math.hypot(f1.x - c.x, f1.y - c.y) * 1;\n const angleXU = Math.atan2(f1.y - c.y, f1.x - c.x);\n // minor radius is a parameter on the ellipse primitive; approximate\n // pull via ratio is not exposed — keep stored minor (M3 scope).\n out.push({ ...g, cx: c.x, cy: c.y, majorRadius: g.majorRadius * (major / g.majorRadius), angleXU });\n } else out.push(g);\n break;\n }\n }\n }\n return out;\n }\n\n /** Read a point's solved coordinates from the sketch index.\n * apply_solution() already pulled every primitive's solved values back into\n * sketch_index (gcs_wrapper.js:104-108), so get_primitive is authoritative. */\n private readPoint(key: PtKey): { x: number; y: number } | undefined {\n const p = this.wrapper.sketch_index.get_primitive(key) as { x?: number; y?: number } | undefined;\n if (!p || typeof p.x !== 'number' || typeof p.y !== 'number') return undefined;\n return { x: p.x, y: p.y };\n }\n\n private readCircleRadius(geoIndex: number): number | undefined {\n const c = this.wrapper.sketch_index.get_primitive(`C${geoIndex}`) as { radius?: number } | undefined;\n return typeof c?.radius === 'number' ? c.radius : undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"planegcs-backend.js","sourceRoot":"","sources":["../../src/fcstd/planegcs-backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M3.2/M3.3/M3.4 — planegcs WASM backend for the SketchSolver interface.\n *\n * M3.3: geometry → GCS primitives, including the implicit fixed RtPnt/HAxis/\n * VAxis (geoId -1/-2, plan §5.4). External geometry (geoId <= -3) is rejected\n * upstream (D4: whole sketch downgrades to L2).\n * M3.4: constraints → GCS primitives for the P0 set (plan §7 M3.4).\n * M3.5 helper: solved params are pulled back and geometry rebuilt, so the\n * caller can compare against on-disk coordinates (D2).\n */\nimport { make_gcs_wrapper, Algorithm } from '@salusoft89/planegcs';\nimport type { GcsWrapper } from '@salusoft89/planegcs';\nimport { ok, type Result } from '../api/result.js';\nimport type { SketchGeom, SketchCon } from './sketch-parse.js';\nimport { ConstraintType, PointPos } from './sketch-parse.js';\nimport type { SolveOutcome, SketchSolver } from './sketch-solver.js';\nimport { SUPPORTED_CONSTRAINT_TYPES } from './sketch-solver.js';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\n\nconst require = createRequire(import.meta.url);\n\nlet wasmPathCache: string | undefined;\n/**\n * Resolve the planegcs WASM binary path from the installed package.\n *\n * @returns the absolute path of `planegcs.wasm` inside `@salusoft89/planegcs`.\n */\nexport function planegcsWasmPath(): string {\n if (!wasmPathCache) {\n const pkgDir = dirname(require.resolve('@salusoft89/planegcs/package.json'));\n wasmPathCache = join(pkgDir, 'dist', 'planegcs_dist', 'planegcs.wasm');\n }\n return wasmPathCache;\n}\n\n/**\n * Instantiate the planegcs WASM solver.\n *\n * @returns a `SketchSolver` backed by the planegcs WASM module.\n */\nexport async function createPlanegcsSolver(): Promise<SketchSolver> {\n const wrapper = await make_gcs_wrapper(planegcsWasmPath());\n return new PlanegcsSolver(wrapper);\n}\n\n/** Internal identity for a GCS point owned by a geometry element. */\ntype PtKey = string;\n\nconst P = (geoId: number, pos: number): PtKey => `g${geoId}p${pos}`;\n\n/**\n * planegcs WASM implementation of the `SketchSolver` interface (M3.2–M3.4):\n * pushes geometry/constraints into the GCS, solves, and pulls the solved\n * parameters back into `SketchGeom` values.\n */\nexport class PlanegcsSolver implements SketchSolver {\n constructor(private wrapper: GcsWrapper) {}\n\n async solve(\n geoms: SketchGeom[],\n constraints: SketchCon[],\n external?: import('./sketch-solver.js').ExternalFixedSeg[],\n ): Promise<Result<SolveOutcome, never>> {\n const externalMap = new Map<number, import('./sketch-solver.js').ExternalFixedSeg>(\n (external ?? []).map((e) => [e.geoId, e]),\n );\n // a constraint referencing an unresolvable external geoId is dropped\n const unresolvableExternal = new Set<number>();\n for (const c of constraints) {\n for (const r of c.refs) {\n if (r.geoId <= -3 && r.geoId > -2000 && !externalMap.has(r.geoId)) {\n unresolvableExternal.add(c.index);\n }\n }\n }\n const usableConstraints = constraints.filter((c) => !unresolvableExternal.has(c.index));\n\n const unsupported = usableConstraints.find((c) => !SUPPORTED_CONSTRAINT_TYPES.has(c.type));\n if (unsupported) {\n return ok({\n geoms,\n converged: false,\n reason: 'unsupported-constraint',\n problemConstraints: [unsupported.index],\n droppedConstraints: [...unresolvableExternal],\n });\n }\n\n const w = this.wrapper;\n w.clear_data();\n\n // --- M3.3: implicit fixed frame (root point + H/V axes) ---\n w.push_primitive({ type: 'point', id: P(-1, 1), x: 0, y: 0, fixed: true });\n // GOTCHA (probe-sym-min.ts / probe-l1-ablation.ts): FreeCAD models HAxis/\n // VAxis as real Line entries in Geoms (geoId -1/-2), so constraints may\n // reference axis points (pos 1/2) or the axis edge (pos 0) — e.g.\n // DistanceX(line-point, VAxis) fixes an x coordinate. planegcs has no\n // implicit axes, so we materialize both axes as fixed point+line pairs\n // and register them in `lines` (below) so all constraint shapes see them.\n w.push_primitive({ type: 'point', id: P(-1, 2), x: 1, y: 0, fixed: true });\n w.push_primitive({ type: 'point', id: P(-2, 1), x: 0, y: 0, fixed: true });\n w.push_primitive({ type: 'point', id: P(-2, 2), x: 0, y: 1, fixed: true });\n w.push_primitive({ type: 'line', id: 'L-1', p1_id: P(-1, 1), p2_id: P(-1, 2) });\n w.push_primitive({ type: 'line', id: 'L-2', p1_id: P(-2, 1), p2_id: P(-2, 2) });\n\n // --- M6.3: external fixed geometry (geoId -3, -4, ... in link order) ---\n const externalLines = new Map<number, { p1: PtKey; p2: PtKey }>();\n for (const ext of external ?? []) {\n if (ext.polyline.length === 2) {\n // straight segment: two fixed endpoints + fixed line\n const p1 = P(ext.geoId, 1);\n const p2 = P(ext.geoId, 2);\n w.push_primitive({ type: 'point', id: p1, x: ext.polyline[0]![0], y: ext.polyline[0]![1], fixed: true });\n w.push_primitive({ type: 'point', id: p2, x: ext.polyline[1]![0], y: ext.polyline[1]![1], fixed: true });\n w.push_primitive({ type: 'line', id: `X${ext.geoId}`, p1_id: p1, p2_id: p2 });\n externalLines.set(ext.geoId, { p1, p2 });\n } else {\n // multi-point polyline: pin sampled points as fixed point targets\n ext.polyline.forEach((pt, i) => {\n w.push_primitive({\n type: 'point', id: P(ext.geoId, i + 1), x: pt[0], y: pt[1], fixed: true,\n });\n });\n }\n }\n\n // --- M3.3: geometry → primitives ---\n // Track which point keys exist as standalone points vs derived from lines.\n const lines = new Map<number, { p1: PtKey; p2: PtKey }>();\n const arcs = new Map<number, { center: PtKey; start: PtKey; end: PtKey }>();\n const circles = new Map<number, { center: PtKey }>();\n const ellipses = new Map<number, { center: PtKey; focus1: PtKey }>();\n const standalone = new Map<number, PtKey>();\n // implicit axes are first-class lines for constraint resolution (see\n // the GOTCHA block above): geoId -1 = HAxis, -2 = VAxis\n lines.set(-1, { p1: P(-1, 1), p2: P(-1, 2) });\n lines.set(-2, { p1: P(-2, 1), p2: P(-2, 2) });\n\n // pass 1: standalone points that are constraint anchors\n const anchorNeedsStandalone = new Set<string>();\n for (const c of constraints) {\n for (const r of c.refs) {\n if (r.geoId >= 0 && r.pos !== PointPos.none) anchorNeedsStandalone.add(P(r.geoId, r.pos));\n }\n }\n for (const g of geoms) {\n switch (g.kind) {\n case 'point': {\n const id = P(g.index, 1);\n standalone.set(g.index, id);\n w.push_primitive({ type: 'point', id, x: g.x, y: g.y, fixed: false });\n break;\n }\n default:\n break;\n }\n }\n // pass 2: curves; create endpoint points for lines/arcs, center points\n for (const g of geoms) {\n switch (g.kind) {\n case 'line': {\n const p1 = anchorNeedsStandalone.has(P(g.index, 1)) ? P(g.index, 1) : P(g.index, 1);\n const p2 = P(g.index, 2);\n // create endpoint points as real GCS points, then a line over them\n for (const [id, x, y] of [\n [p1, g.x1, g.y1],\n [p2, g.x2, g.y2],\n ] as const) {\n w.push_primitive({ type: 'point', id, x, y, fixed: false });\n }\n w.push_primitive({ type: 'line', id: `L${g.index}`, p1_id: p1, p2_id: p2 });\n lines.set(g.index, { p1, p2 });\n break;\n }\n case 'circle': {\n const c = P(g.index, 3);\n w.push_primitive({ type: 'point', id: c, x: g.cx, y: g.cy, fixed: false });\n w.push_primitive({ type: 'circle', id: `C${g.index}`, c_id: c, radius: g.radius });\n circles.set(g.index, { center: c });\n break;\n }\n case 'arc': {\n const c = P(g.index, 3);\n const s = P(g.index, 1);\n const e = P(g.index, 2);\n for (const [id, x, y] of [\n [c, g.cx, g.cy],\n [s, g.x1, g.y1],\n [e, g.x2, g.y2],\n ] as const) {\n w.push_primitive({ type: 'point', id, x, y, fixed: false });\n }\n w.push_primitive({\n type: 'arc', id: `A${g.index}`, c_id: c, start_id: s, end_id: e,\n start_angle: g.startAngle, end_angle: g.endAngle, radius: g.radius,\n });\n arcs.set(g.index, { center: c, start: s, end: e });\n break;\n }\n case 'ellipse': {\n const c = P(g.index, 3);\n const f1 = P(g.index, 1);\n for (const [id, x, y] of [\n [c, g.cx, g.cy],\n [f1, g.fx1, g.fy1],\n ] as const) {\n w.push_primitive({ type: 'point', id, x, y, fixed: false });\n }\n w.push_primitive({\n type: 'ellipse', id: `E${g.index}`, c_id: c, focus1_id: f1, radmin: g.minorRadius,\n });\n ellipses.set(g.index, { center: c, focus1: f1 });\n break;\n }\n case 'point':\n break; // handled in pass 1\n }\n }\n\n // --- M3.4: constraints → primitives ---\n // A constraint whose GCS shape cannot be pushed is dropped and recorded\n // (D3: no silent loss — surfaced via droppedConstraints).\n const droppedConstraints: number[] = [...unresolvableExternal];\n for (const c of usableConstraints) {\n let prims: Record<string, unknown>[];\n try {\n prims = this.constraintToPrimitives(c, { lines, arcs, circles, ellipses, standalone, externalLines });\n } catch {\n droppedConstraints.push(c.index);\n continue;\n }\n try {\n for (const p of prims) w.push_primitive(p as never);\n } catch {\n droppedConstraints.push(c.index);\n continue;\n }\n }\n\n // --- solve (D2: initial values = on-disk coordinates) ---\n const status = w.solve(Algorithm.LevenbergMarquardt);\n const conflicting = w.has_gcs_conflicting_constraints();\n const redundant = w.has_gcs_redundant_constraints();\n\n if (status !== 0 || conflicting) {\n const problem = conflicting ? w.get_gcs_conflicting_constraints() : w.get_gcs_redundant_constraints();\n const problemConstraints = problem\n .map((s) => Number(s.replace(/^c/, '')))\n .filter((n) => Number.isFinite(n));\n return ok({\n geoms,\n converged: false,\n reason: conflicting ? 'conflicting' : redundant ? 'redundant' : 'failed',\n problemConstraints,\n droppedConstraints,\n });\n }\n\n w.apply_solution();\n\n // --- pull back solved coordinates and rebuild geometry ---\n const solved = this.pullBack(geoms, { lines, arcs, circles, ellipses, standalone });\n return ok({ geoms: solved, converged: true, problemConstraints: [], droppedConstraints });\n }\n\n private constraintToPrimitives(\n c: SketchCon,\n ctx: {\n lines: Map<number, { p1: PtKey; p2: PtKey }>;\n arcs: Map<number, { center: PtKey; start: PtKey; end: PtKey }>;\n circles: Map<number, { center: PtKey }>;\n ellipses: Map<number, { center: PtKey; focus1: PtKey }>;\n standalone: Map<number, PtKey>;\n externalLines: Map<number, { p1: PtKey; p2: PtKey }>;\n },\n ): Record<string, unknown>[] {\n const out: Record<string, unknown>[] = [];\n const id = `c${c.index}`;\n const r = c.refs;\n // guards: old-format fallback may yield < 2 refs for pair constraints\n if (r.length < 1) return out;\n const pt = (ref: { geoId: number; pos: number } | undefined): PtKey | undefined => {\n if (!ref) return undefined;\n if (ref.geoId === -1) return P(-1, 1); // root point\n if (ref.geoId === -2) return P(-2, ref.pos === 0 ? 1 : ref.pos); // VAxis point\n if (ref.geoId <= -3 && ref.geoId > -2000) {\n // M6.3 external geometry: endpoint/point refs onto fixed segments\n const ext = ctx.externalLines.get(ref.geoId);\n if (!ext) return undefined;\n if (ref.pos === 1) return ext.p1;\n if (ref.pos === 2) return ext.p2;\n return undefined; // pos=0 (edge itself) handled by line-typed paths\n }\n if (ref.geoId >= 0) return P(ref.geoId, ref.pos);\n return undefined;\n };\n\n switch (c.type) {\n case ConstraintType.Coincident: {\n const p1 = pt(r[0]!);\n const p2 = pt(r[1]!);\n if (p1 && p2) out.push({ type: 'p2p_coincident', id, p1_id: p1, p2_id: p2 });\n break;\n }\n case ConstraintType.Horizontal: {\n // Horizontal with pos=0 refs is the HAxis case: line horizontal\n if (r[0]!.pos === PointPos.none || r.length >= 1 && r[0]!.pos !== PointPos.mid) {\n if (r.length === 1) {\n // horizontal via axis: geoId is the line itself\n const line = ctx.lines.get(r[0]!.geoId);\n if (line) out.push({ type: 'horizontal_l', id, l_id: line ? `L${r[0]!.geoId}` : '' });\n } else {\n const p1 = pt(r[0]!);\n const p2 = pt(r[1]!);\n if (p1 && p2) out.push({ type: 'horizontal_pp', id, p1_id: p1, p2_id: p2 });\n }\n }\n break;\n }\n case ConstraintType.Vertical: {\n if (r.length === 1) {\n const gid = `L${r[0]!.geoId}`;\n if (ctx.lines.has(r[0]!.geoId)) out.push({ type: 'vertical_l', id, l_id: gid });\n } else {\n const p1 = pt(r[0]!);\n const p2 = pt(r[1]!);\n if (p1 && p2) out.push({ type: 'vertical_pp', id, p1_id: p1, p2_id: p2 });\n }\n break;\n }\n case ConstraintType.Parallel: {\n if (r.length === 2 && ctx.lines.has(r[0]!.geoId) && ctx.lines.has(r[1]!.geoId)) {\n out.push({\n type: 'parallel', id,\n l1_id: `L${r[0]!.geoId}`, l2_id: `L${r[1]!.geoId}`,\n internalalignment: 0,\n });\n }\n break;\n }\n case ConstraintType.Perpendicular: {\n if (r.length === 2 && ctx.lines.has(r[0]!.geoId) && ctx.lines.has(r[1]!.geoId)) {\n out.push({ type: 'perpendicular_ll', id, l1_id: `L${r[0]!.geoId}`, l2_id: `L${r[1]!.geoId}` });\n }\n break;\n }\n case ConstraintType.Distance: {\n // p2p / p2l / p2c / c2c variants by ref shapes.\n // GOTCHA (probe-l1-ablation.ts): a second ref that is an AXIS EDGE\n // (geoId -1/-2, pos=0) is a point-to-LINE distance against the axis\n // (FreeCAD Sketch.cpp addDistanceConstraint(point, line)) — e.g.\n // Distance(p, HAxis) = |y|. Resolving the axis edge to the root point\n // and emitting p2p_distance instead drags the point onto a circle\n // around the origin (taperedballnose collapse, delta 2.3e1).\n const p1 = pt(r[0]!);\n const axisEdgeDist = r.length >= 2 && r[1]!.pos === PointPos.none && (r[1]!.geoId === -1 || r[1]!.geoId === -2);\n if (axisEdgeDist && p1) {\n out.push({ type: 'p2l_distance', id, p_id: p1, l_id: `L${r[1]!.geoId}`, distance: c.value });\n } else if (p1 && r[1] && r[1].pos === PointPos.none && ctx.lines.has(r[1].geoId)) {\n out.push({ type: 'p2l_distance', id, p_id: p1, l_id: `L${r[1]!.geoId}`, distance: c.value });\n } else if (p1 && r[1]) {\n const p2 = pt(r[1]);\n if (p2) out.push({ type: 'p2p_distance', id, p1_id: p1, p2_id: p2, distance: c.value });\n }\n break;\n }\n case ConstraintType.DistanceX: {\n // planegcs 'difference' semantics: param2 - param1 = difference\n // (verified empirically). FCStd DistanceX value = second.x - first.x.\n // GOTCHA (probe-l1-ablation.ts, Sketch.cpp:2053): when the second ref\n // is an AXIS EDGE (geoId -1/-2, pos=0) FreeCAD treats it as GeoUndef —\n // an ABSOLUTE coordinate constraint (coordinate_x), not a difference\n // against the axis point. Mapping it to 'difference' forces x = -value\n // and produced the taperedballnose wrong solution (delta 2.3e1).\n const axisEdge = r.length >= 2 && r[1]!.pos === PointPos.none && (r[1]!.geoId === -1 || r[1]!.geoId === -2);\n const firstIsPoint = r[0]!.pos !== PointPos.none || r[0]!.geoId < 0;\n if (axisEdge && firstIsPoint) {\n const p = pt(r[0]!);\n if (p) out.push({ type: 'coordinate_x', id, p_id: p, x: c.value });\n break;\n }\n const p1 = pt(r[0]!);\n const p2 = pt(r[1]!);\n if (p1 && p2) {\n out.push({\n type: 'difference',\n id,\n param1: { o_id: p1, prop: 'x' },\n param2: { o_id: p2, prop: 'x' },\n difference: c.value,\n });\n }\n break;\n }\n case ConstraintType.DistanceY: {\n // symmetric case to DistanceX: axis-edge second ref → absolute y\n const axisEdge = r.length >= 2 && r[1]!.pos === PointPos.none && (r[1]!.geoId === -1 || r[1]!.geoId === -2);\n const firstIsPoint = r[0]!.pos !== PointPos.none || r[0]!.geoId < 0;\n if (axisEdge && firstIsPoint) {\n const p = pt(r[0]!);\n if (p) out.push({ type: 'coordinate_y', id, p_id: p, y: c.value });\n break;\n }\n const p1 = pt(r[0]!);\n const p2 = pt(r[1]!);\n if (p1 && p2) {\n out.push({\n type: 'difference',\n id,\n param1: { o_id: p1, prop: 'y' },\n param2: { o_id: p2, prop: 'y' },\n difference: c.value,\n });\n }\n break;\n }\n case ConstraintType.Angle: {\n // FreeCAD Sketch.cpp case Angle — 4 shapes by ref count/pos:\n // ① Third != GeoUndef → angle-via-point (not needed by corpus P0 set;\n // dropped explicitly below if encountered)\n // ② SecondPos != none → l2l_angle_pppp (lines with explicit start points:\n // pos==start keeps direction, pos==end swaps the point pair)\n // ③ Second set, both pos none → l2l_angle_ll (line-level)\n // ④ only First → p2p_angle on the line's own points (orientation)\n // refs may carry a Third = -2000 (GeoUndef sentinel) — filter it.\n const refs = r.filter((x) => x.geoId !== -2000);\n if (refs.length >= 3) {\n // ① via-point angle: not in the P0 mapping set — record as dropped\n break;\n }\n if (refs.length === 2) {\n const [a, b] = refs as [{ geoId: number; pos: number }, { geoId: number; pos: number }];\n const lineA = ctx.lines.has(a.geoId);\n const lineB = ctx.lines.has(b.geoId);\n if (lineA && lineB && a.pos !== PointPos.none && b.pos !== PointPos.none) {\n // ② explicit start points; pos=end reverses that line's direction\n const a1 = a.pos === PointPos.start ? P(a.geoId, 1) : P(a.geoId, 2);\n const a2 = a.pos === PointPos.start ? P(a.geoId, 2) : P(a.geoId, 1);\n const b1 = b.pos === PointPos.start ? P(b.geoId, 1) : P(b.geoId, 2);\n const b2 = b.pos === PointPos.start ? P(b.geoId, 2) : P(b.geoId, 1);\n out.push({ type: 'l2l_angle_pppp', id, l1p1_id: a1, l1p2_id: a2, l2p1_id: b1, l2p2_id: b2, angle: c.value });\n } else if (lineA && lineB) {\n // ③ line-level angle\n out.push({\n type: 'l2l_angle_ll', id,\n l1_id: `L${a.geoId}`, l2_id: `L${b.geoId}`,\n angle: c.value,\n internalalignment: 0,\n });\n }\n } else if (refs.length === 1 && ctx.lines.has(refs[0]!.geoId)) {\n // ④ orientation angle of a single line (p2p_angle on its points)\n out.push({ type: 'p2p_angle', id, p1_id: P(refs[0]!.geoId, 1), p2_id: P(refs[0]!.geoId, 2), angle: c.value });\n }\n break;\n }\n case ConstraintType.Radius: {\n if (ctx.circles.has(r[0]!.geoId)) {\n out.push({ type: 'circle_radius', id, c_id: `C${r[0]!.geoId}`, radius: c.value });\n } else if (ctx.arcs.has(r[0]!.geoId)) {\n out.push({ type: 'arc_radius', id, a_id: `A${r[0]!.geoId}`, radius: c.value });\n }\n break;\n }\n case ConstraintType.Diameter: {\n if (ctx.circles.has(r[0]!.geoId)) {\n out.push({ type: 'circle_diameter', id, c_id: `C${r[0]!.geoId}`, diameter: c.value });\n } else if (ctx.arcs.has(r[0]!.geoId)) {\n out.push({ type: 'arc_diameter', id, a_id: `A${r[0]!.geoId}`, diameter: c.value });\n }\n break;\n }\n case ConstraintType.Equal: {\n // equal_length for line pairs; equal_radii for circle/arc pairs\n if (r.length === 2) {\n const g0 = r[0]!.geoId;\n const g1 = r[1]!.geoId;\n if (ctx.lines.has(g0) && ctx.lines.has(g1)) {\n out.push({ type: 'equal_length', id, l1_id: `L${g0}`, l2_id: `L${g1}` });\n } else if ((ctx.circles.has(g0) || ctx.arcs.has(g0)) && (ctx.circles.has(g1) || ctx.arcs.has(g1))) {\n // arcs use their own primitive id (A{n}); circles use C{n}\n const id0 = ctx.circles.has(g0) ? `C${g0}` : `A${g0}`;\n const id1 = ctx.circles.has(g1) ? `C${g1}` : `A${g1}`;\n out.push({ type: 'equal_radius_cc', id, c1_id: id0, c2_id: id1 });\n } else if (ctx.ellipses.has(g0) && ctx.ellipses.has(g1)) {\n out.push({ type: 'equal_radii_ee', id, e1_id: `E${g0}`, e2_id: `E${g1}` });\n }\n }\n break;\n }\n case ConstraintType.PointOnObject: {\n const p = pt(r[0]!);\n if (p && r[1]!.pos === PointPos.none) {\n const onGeoId = r[1]!.geoId;\n if (ctx.lines.has(onGeoId)) {\n out.push({ type: 'point_on_line_pl', id, p_id: p, l_id: `L${onGeoId}` });\n } else if (ctx.externalLines.has(onGeoId)) {\n // M6.3: point-on-external-edge → point_on_line against the fixed line\n out.push({ type: 'point_on_line_pl', id, p_id: p, l_id: `X${onGeoId}` });\n } else if (ctx.circles.has(onGeoId)) {\n out.push({ type: 'point_on_circle', id, p_id: p, c_id: `C${onGeoId}` });\n } else if (ctx.arcs.has(onGeoId)) {\n out.push({ type: 'point_on_arc', id, p_id: p, a_id: `A${onGeoId}` });\n }\n }\n break;\n }\n case ConstraintType.Symmetric: {\n // Symmetric(p1, p2, line) or Symmetric(p1, p2, p3)\n const p1 = pt(r[0]!);\n const p2 = pt(r[1]!);\n if (p1 && p2) {\n if (r.length >= 3 && r[2]!.pos === PointPos.none && ctx.lines.has(r[2]!.geoId)) {\n out.push({ type: 'p2p_symmetric_ppl', id, p1_id: p1, p2_id: p2, l_id: `L${r[2]!.geoId}` });\n } else {\n const p3 = pt(r[2]!);\n if (p3) out.push({ type: 'p2p_symmetric_ppp', id, p1_id: p1, p2_id: p2, p_id: p3 });\n }\n }\n break;\n }\n case ConstraintType.Tangent: {\n // line-circle / circle-circle / line-arc / arc-arc (edge-level, pos=0)\n const a = r[0]!;\n const b = r[1]!;\n if (!a || !b) break;\n const lineA = ctx.lines.has(a.geoId);\n const circA = ctx.circles.has(a.geoId);\n const arcA = ctx.arcs.has(a.geoId);\n const lineB = ctx.lines.has(b.geoId);\n const circB = ctx.circles.has(b.geoId);\n const arcB = ctx.arcs.has(b.geoId);\n if (lineA && circB) out.push({ type: 'tangent_lc', id, l_id: `L${a.geoId}`, c_id: `C${b.geoId}`, internalalignment: 0 });\n else if (circA && lineB) out.push({ type: 'tangent_lc', id, l_id: `L${b.geoId}`, c_id: `C${a.geoId}`, internalalignment: 0 });\n else if (circA && circB) out.push({ type: 'tangent_cc', id, c1_id: `C${a.geoId}`, c2_id: `C${b.geoId}`, internalalignment: 0 });\n else if (lineA && arcB) out.push({ type: 'tangent_la', id, l_id: `L${a.geoId}`, a_id: `A${b.geoId}`, internalalignment: 0 });\n else if (arcA && lineB) out.push({ type: 'tangent_la', id, l_id: `L${b.geoId}`, a_id: `A${a.geoId}`, internalalignment: 0 });\n else if (arcA && arcB) out.push({ type: 'tangent_aa', id, a1_id: `A${a.geoId}`, a2_id: `A${b.geoId}`, internalalignment: 0 });\n break;\n }\n default:\n break; // unsupported types never reach here (guard in solve())\n }\n return out;\n }\n\n private pullBack(\n geoms: SketchGeom[],\n ctx: {\n lines: Map<number, { p1: PtKey; p2: PtKey }>;\n arcs: Map<number, { center: PtKey; start: PtKey; end: PtKey }>;\n circles: Map<number, { center: PtKey }>;\n ellipses: Map<number, { center: PtKey; focus1: PtKey }>;\n standalone: Map<number, PtKey>;\n },\n ): SketchGeom[] {\n // After apply_solution, re-derive geometry from the wrapper's primitive\n // state via pull through the wrapper's sketch index.\n const out: SketchGeom[] = [];\n for (const g of geoms) {\n switch (g.kind) {\n case 'point': {\n const key = ctx.standalone.get(g.index);\n const pt = key ? this.readPoint(key) : undefined;\n out.push(pt ? { ...g, x: pt.x, y: pt.y } : g);\n break;\n }\n case 'line': {\n const l = ctx.lines.get(g.index)!;\n const p1 = this.readPoint(l.p1);\n const p2 = this.readPoint(l.p2);\n out.push(p1 && p2 ? { ...g, x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y } : g);\n break;\n }\n case 'circle': {\n const cc = ctx.circles.get(g.index)!.center;\n const c = this.readPoint(cc);\n const rad = this.readCircleRadius(g.index);\n out.push(c && rad !== undefined ? { ...g, cx: c.x, cy: c.y, radius: rad } : g);\n break;\n }\n case 'arc': {\n const a = ctx.arcs.get(g.index)!;\n const c = this.readPoint(a.center);\n const s = this.readPoint(a.start);\n const e = this.readPoint(a.end);\n if (c && s && e) {\n const r = Math.hypot(s.x - c.x, s.y - c.y);\n const startAngle = Math.atan2(s.y - c.y, s.x - c.x);\n const endAngle = Math.atan2(e.y - c.y, e.x - c.x);\n out.push({ ...g, cx: c.x, cy: c.y, radius: r, startAngle, endAngle, x1: s.x, y1: s.y, x2: e.x, y2: e.y });\n } else out.push(g);\n break;\n }\n case 'ellipse': {\n const el = ctx.ellipses.get(g.index)!;\n const c = this.readPoint(el.center);\n const f1 = this.readPoint(el.focus1);\n if (c && f1) {\n const major = Math.hypot(f1.x - c.x, f1.y - c.y) * 1;\n const angleXU = Math.atan2(f1.y - c.y, f1.x - c.x);\n // minor radius is a parameter on the ellipse primitive; approximate\n // pull via ratio is not exposed — keep stored minor (M3 scope).\n out.push({ ...g, cx: c.x, cy: c.y, majorRadius: g.majorRadius * (major / g.majorRadius), angleXU });\n } else out.push(g);\n break;\n }\n }\n }\n return out;\n }\n\n /** Read a point's solved coordinates from the sketch index.\n * apply_solution() already pulled every primitive's solved values back into\n * sketch_index (gcs_wrapper.js:104-108), so get_primitive is authoritative. */\n private readPoint(key: PtKey): { x: number; y: number } | undefined {\n const p = this.wrapper.sketch_index.get_primitive(key) as { x?: number; y?: number } | undefined;\n if (!p || typeof p.x !== 'number' || typeof p.y !== 'number') return undefined;\n return { x: p.x, y: p.y };\n }\n\n private readCircleRadius(geoIndex: number): number | undefined {\n const c = this.wrapper.sketch_index.get_primitive(`C${geoIndex}`) as { radius?: number } | undefined;\n return typeof c?.radius === 'number' ? c.radius : undefined;\n }\n}\n"]}
@@ -36,6 +36,10 @@ export declare const ConstraintType: {
36
36
  readonly Group: 20;
37
37
  readonly Text: 21;
38
38
  };
39
+ /**
40
+ * Human-readable names for the ConstraintType enum integers (debugging/
41
+ * diagnostics only).
42
+ */
39
43
  export declare const CONSTRAINT_NAMES: Record<number, string>;
40
44
  /** GeoEnum (src/Mod/Sketcher/App/GeoEnum.h:71-78) */
41
45
  export declare const GeoId: {
@@ -51,6 +55,10 @@ export declare const PointPos: {
51
55
  readonly end: 2;
52
56
  readonly mid: 3;
53
57
  };
58
+ /**
59
+ * One parsed sketch geometry element (point, line, circle, arc or ellipse),
60
+ * in 3D sketch-local coordinates.
61
+ */
54
62
  export type SketchGeom = {
55
63
  kind: 'point';
56
64
  index: number;
@@ -105,10 +113,19 @@ export type SketchGeom = {
105
113
  fx2: number;
106
114
  fy2: number;
107
115
  };
116
+ /**
117
+ * One (geometry, point) reference inside a constraint: a geoId plus a
118
+ * PointPos selector.
119
+ */
108
120
  export interface GeoRef {
121
+ /** geometry id: >= 0 own geometry; -1 HAxis/RtPnt; -2 VAxis; <= -3 external */
109
122
  geoId: number;
123
+ /** PointPos selector (0 = edge itself, 1/2 = start/end, 3 = center) */
110
124
  pos: number;
111
125
  }
126
+ /**
127
+ * One parsed sketch constraint (`<Constrain>` element).
128
+ */
112
129
  export interface SketchCon {
113
130
  /** index in the ConstraintList */
114
131
  index: number;
@@ -125,6 +142,10 @@ export interface SketchCon {
125
142
  /** InternalAlignmentType when type === 15 */
126
143
  internalAlignmentType?: number;
127
144
  }
145
+ /**
146
+ * The fully parsed sketch: geometry, constraints, constrainedness and the set
147
+ * of referenced external geoIds.
148
+ */
128
149
  export interface ParsedSketch {
129
150
  geoms: SketchGeom[];
130
151
  constraints: SketchCon[];
@@ -132,7 +153,29 @@ export interface ParsedSketch {
132
153
  /** geoIds <= -3 referenced by constraints (D4 external geometry) */
133
154
  externalGeoIds: number[];
134
155
  }
156
+ /**
157
+ * Parse a sketch's `<GeometryList>` property into typed geometry elements.
158
+ *
159
+ * @param prop - the sketch's Geometry property.
160
+ * @returns the parsed geometry list; unsupported element kinds degrade to a
161
+ * NaN point so the caller can downgrade the sketch.
162
+ */
135
163
  export declare function parseGeometryList(prop: FcstdProperty): SketchGeom[];
164
+ /**
165
+ * Parse a sketch's `<ConstraintList>` property into constraint records.
166
+ *
167
+ * @param prop - the sketch's Constraints property.
168
+ * @returns the parsed constraints, with element refs resolved from
169
+ * ElementIds/ElementPositions or the old First/Second/Third fallback.
170
+ */
136
171
  export declare function parseConstraintList(prop: FcstdProperty): SketchCon[];
172
+ /**
173
+ * Parse a sketch object's geometry and constraint properties (M3.1 entry).
174
+ *
175
+ * @param geometryProp - the sketch's Geometry property (may be undefined).
176
+ * @param constraintsProp - the sketch's Constraints property (may be undefined).
177
+ * @param fullyConstrained - the sketch's FullyConstrained flag.
178
+ * @returns the parsed sketch, including external geoIds referenced by constraints.
179
+ */
137
180
  export declare function parseSketchObject(geometryProp: FcstdProperty | undefined, constraintsProp: FcstdProperty | undefined, fullyConstrained: boolean): ParsedSketch;
138
181
  //# sourceMappingURL=sketch-parse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sketch-parse.d.ts","sourceRoot":"","sources":["../../src/fcstd/sketch-parse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sketch-parse.d.ts","sourceRoot":"","sources":["../../src/fcstd/sketch-parse.ts"],"names":[],"mappings":"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"}