@faicad/faijs 0.18.3 → 0.22.2

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 (241) hide show
  1. package/dist/api/api-namespace.d.ts.map +1 -1
  2. package/dist/api/api-namespace.js +4 -1
  3. package/dist/api/api-namespace.js.map +1 -1
  4. package/dist/api/brep-mirror/joinery-brep.d.ts +1 -1
  5. package/dist/api/brep-mirror/joinery-brep.d.ts.map +1 -1
  6. package/dist/api/brep-mirror/joinery-brep.js +22 -20
  7. package/dist/api/brep-mirror/joinery-brep.js.map +1 -1
  8. package/dist/api/generated/script-face-manifest.d.ts +4 -0
  9. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  10. package/dist/api/generated/script-face-manifest.js.map +1 -1
  11. package/dist/api/index.d.ts +4 -0
  12. package/dist/api/index.d.ts.map +1 -1
  13. package/dist/api/index.js +3 -0
  14. package/dist/api/index.js.map +1 -1
  15. package/dist/api/knurl.d.ts.map +1 -1
  16. package/dist/api/knurl.js +1 -0
  17. package/dist/api/knurl.js.map +1 -1
  18. package/dist/api/primitives.d.ts +4 -3
  19. package/dist/api/primitives.d.ts.map +1 -1
  20. package/dist/api/primitives.js +9 -3
  21. package/dist/api/primitives.js.map +1 -1
  22. package/dist/api/profile.d.ts +34 -5
  23. package/dist/api/profile.d.ts.map +1 -1
  24. package/dist/api/profile.js +168 -186
  25. package/dist/api/profile.js.map +1 -1
  26. package/dist/api/punch-hole.d.ts +77 -0
  27. package/dist/api/punch-hole.d.ts.map +1 -0
  28. package/dist/api/punch-hole.js +207 -0
  29. package/dist/api/punch-hole.js.map +1 -0
  30. package/dist/api/sketch-on-face.d.ts +85 -0
  31. package/dist/api/sketch-on-face.d.ts.map +1 -0
  32. package/dist/api/sketch-on-face.js +136 -0
  33. package/dist/api/sketch-on-face.js.map +1 -0
  34. package/dist/api/sketch-on-plane.d.ts +87 -0
  35. package/dist/api/sketch-on-plane.d.ts.map +1 -0
  36. package/dist/api/sketch-on-plane.js +106 -0
  37. package/dist/api/sketch-on-plane.js.map +1 -0
  38. package/dist/api/surface/arg-spec.d.ts +8 -0
  39. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  40. package/dist/api/surface/arg-spec.js.map +1 -1
  41. package/dist/api/transform.d.ts +5 -5
  42. package/dist/api/transform.d.ts.map +1 -1
  43. package/dist/api/transform.js +12 -10
  44. package/dist/api/transform.js.map +1 -1
  45. package/dist/api/xml-dom.d.ts +27 -0
  46. package/dist/api/xml-dom.d.ts.map +1 -0
  47. package/dist/api/xml-dom.js +45 -0
  48. package/dist/api/xml-dom.js.map +1 -0
  49. package/dist/boolean/csg-backend.d.ts +6 -6
  50. package/dist/boolean/csg-backend.d.ts.map +1 -1
  51. package/dist/boolean/csg-backend.js +9 -9
  52. package/dist/boolean/csg-backend.js.map +1 -1
  53. package/dist/boolean/csg-core.d.ts +10 -10
  54. package/dist/boolean/csg-core.d.ts.map +1 -1
  55. package/dist/boolean/csg-core.js +24 -24
  56. package/dist/boolean/csg-core.js.map +1 -1
  57. package/dist/boolean/extrude-helpers.d.ts +8 -8
  58. package/dist/boolean/extrude-helpers.d.ts.map +1 -1
  59. package/dist/boolean/extrude-helpers.js +13 -13
  60. package/dist/boolean/extrude-helpers.js.map +1 -1
  61. package/dist/brep/brep-ops.d.ts +24 -10
  62. package/dist/brep/brep-ops.d.ts.map +1 -1
  63. package/dist/brep/brep-ops.js +46 -18
  64. package/dist/brep/brep-ops.js.map +1 -1
  65. package/dist/brep/brep-topology.d.ts.map +1 -1
  66. package/dist/brep/brep-topology.js +3 -1
  67. package/dist/brep/brep-topology.js.map +1 -1
  68. package/dist/brep/export/export-model.d.ts +79 -0
  69. package/dist/brep/export/export-model.d.ts.map +1 -0
  70. package/dist/brep/export/export-model.js +335 -0
  71. package/dist/brep/export/export-model.js.map +1 -0
  72. package/dist/brep/primitives-brep.d.ts.map +1 -1
  73. package/dist/brep/primitives-brep.js +3 -1
  74. package/dist/brep/primitives-brep.js.map +1 -1
  75. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  76. package/dist/brepkit-kernel/brepkitKernel.js +4 -2
  77. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  78. package/dist/browser-host/csg-worker-protocol.d.ts +3 -3
  79. package/dist/browser-host/csg-worker-protocol.d.ts.map +1 -1
  80. package/dist/browser-host/csg-worker-protocol.js.map +1 -1
  81. package/dist/browser-host/csg-worker.js +3 -3
  82. package/dist/browser-host/csg-worker.js.map +1 -1
  83. package/dist/browser-host/inline-csg-backend.d.ts +3 -3
  84. package/dist/browser-host/inline-csg-backend.d.ts.map +1 -1
  85. package/dist/browser-host/inline-csg-backend.js +3 -3
  86. package/dist/browser-host/inline-csg-backend.js.map +1 -1
  87. package/dist/browser-host/worker-csg-backend.d.ts +3 -3
  88. package/dist/browser-host/worker-csg-backend.d.ts.map +1 -1
  89. package/dist/browser-host/worker-csg-backend.js.map +1 -1
  90. package/dist/cad-runtime/direct-executor.d.ts +4 -0
  91. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  92. package/dist/cad-runtime/direct-executor.js +17 -1
  93. package/dist/cad-runtime/direct-executor.js.map +1 -1
  94. package/dist/cad-runtime/ports.d.ts +3 -3
  95. package/dist/cad-runtime/ports.d.ts.map +1 -1
  96. package/dist/cad-runtime/ports.js.map +1 -1
  97. package/dist/cad-runtime/runtime.d.ts +24 -1
  98. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  99. package/dist/cad-runtime/runtime.js +53 -3
  100. package/dist/cad-runtime/runtime.js.map +1 -1
  101. package/dist/define-op.d.ts +22 -0
  102. package/dist/define-op.d.ts.map +1 -1
  103. package/dist/define-op.js +15 -0
  104. package/dist/define-op.js.map +1 -1
  105. package/dist/env-agnostic.d.ts +7 -7
  106. package/dist/env-agnostic.d.ts.map +1 -1
  107. package/dist/env-agnostic.js +3 -3
  108. package/dist/env-agnostic.js.map +1 -1
  109. package/dist/geometry2d/adapt.d.ts +46 -0
  110. package/dist/geometry2d/adapt.d.ts.map +1 -0
  111. package/dist/geometry2d/adapt.js +41 -0
  112. package/dist/geometry2d/adapt.js.map +1 -0
  113. package/dist/geometry2d/bbox2d.d.ts +82 -0
  114. package/dist/geometry2d/bbox2d.d.ts.map +1 -0
  115. package/dist/geometry2d/bbox2d.js +123 -0
  116. package/dist/geometry2d/bbox2d.js.map +1 -0
  117. package/dist/geometry2d/blueprint-sketcher.d.ts +27 -0
  118. package/dist/geometry2d/blueprint-sketcher.d.ts.map +1 -0
  119. package/dist/geometry2d/blueprint-sketcher.js +29 -0
  120. package/dist/geometry2d/blueprint-sketcher.js.map +1 -0
  121. package/dist/geometry2d/blueprint.d.ts +102 -0
  122. package/dist/geometry2d/blueprint.d.ts.map +1 -0
  123. package/dist/geometry2d/blueprint.js +225 -0
  124. package/dist/geometry2d/blueprint.js.map +1 -0
  125. package/dist/geometry2d/blueprints.d.ts +58 -0
  126. package/dist/geometry2d/blueprints.d.ts.map +1 -0
  127. package/dist/geometry2d/blueprints.js +72 -0
  128. package/dist/geometry2d/blueprints.js.map +1 -0
  129. package/dist/geometry2d/bridge/lift-on-plane.d.ts +50 -0
  130. package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -0
  131. package/dist/geometry2d/bridge/lift-on-plane.js +78 -0
  132. package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -0
  133. package/dist/geometry2d/bridge/on-surface.d.ts +98 -0
  134. package/dist/geometry2d/bridge/on-surface.d.ts.map +1 -0
  135. package/dist/geometry2d/bridge/on-surface.js +94 -0
  136. package/dist/geometry2d/bridge/on-surface.js.map +1 -0
  137. package/dist/geometry2d/bridge/plane.d.ts +69 -0
  138. package/dist/geometry2d/bridge/plane.d.ts.map +1 -0
  139. package/dist/geometry2d/bridge/plane.js +96 -0
  140. package/dist/geometry2d/bridge/plane.js.map +1 -0
  141. package/dist/geometry2d/canned-blueprints.d.ts +44 -0
  142. package/dist/geometry2d/canned-blueprints.d.ts.map +1 -0
  143. package/dist/geometry2d/canned-blueprints.js +94 -0
  144. package/dist/geometry2d/canned-blueprints.js.map +1 -0
  145. package/dist/geometry2d/compound-blueprint.d.ts +72 -0
  146. package/dist/geometry2d/compound-blueprint.d.ts.map +1 -0
  147. package/dist/geometry2d/compound-blueprint.js +95 -0
  148. package/dist/geometry2d/compound-blueprint.js.map +1 -0
  149. package/dist/geometry2d/curve2d.d.ts +298 -0
  150. package/dist/geometry2d/curve2d.d.ts.map +1 -0
  151. package/dist/geometry2d/curve2d.js +1110 -0
  152. package/dist/geometry2d/curve2d.js.map +1 -0
  153. package/dist/geometry2d/index.d.ts +22 -0
  154. package/dist/geometry2d/index.d.ts.map +1 -0
  155. package/dist/geometry2d/index.js +21 -0
  156. package/dist/geometry2d/index.js.map +1 -0
  157. package/dist/geometry2d/organise.d.ts +28 -0
  158. package/dist/geometry2d/organise.d.ts.map +1 -0
  159. package/dist/geometry2d/organise.js +108 -0
  160. package/dist/geometry2d/organise.js.map +1 -0
  161. package/dist/geometry2d/pen-sketcher.d.ts +365 -0
  162. package/dist/geometry2d/pen-sketcher.d.ts.map +1 -0
  163. package/dist/geometry2d/pen-sketcher.js +520 -0
  164. package/dist/geometry2d/pen-sketcher.js.map +1 -0
  165. package/dist/geometry2d/point.d.ts +44 -0
  166. package/dist/geometry2d/point.d.ts.map +1 -0
  167. package/dist/geometry2d/point.js +57 -0
  168. package/dist/geometry2d/point.js.map +1 -0
  169. package/dist/geometry2d/svg-ellipse.d.ts +74 -0
  170. package/dist/geometry2d/svg-ellipse.d.ts.map +1 -0
  171. package/dist/geometry2d/svg-ellipse.js +163 -0
  172. package/dist/geometry2d/svg-ellipse.js.map +1 -0
  173. package/dist/lang/code-to-args.d.ts +29 -3
  174. package/dist/lang/code-to-args.d.ts.map +1 -1
  175. package/dist/lang/code-to-args.js +41 -2
  176. package/dist/lang/code-to-args.js.map +1 -1
  177. package/dist/lang/codegen.d.ts +45 -1
  178. package/dist/lang/codegen.d.ts.map +1 -1
  179. package/dist/lang/codegen.js +135 -6
  180. package/dist/lang/codegen.js.map +1 -1
  181. package/dist/lang/host-arg.d.ts +6 -0
  182. package/dist/lang/host-arg.d.ts.map +1 -1
  183. package/dist/lang/host-arg.js.map +1 -1
  184. package/dist/lang/metadata-extractor.d.ts +25 -0
  185. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  186. package/dist/lang/metadata-extractor.js +289 -25
  187. package/dist/lang/metadata-extractor.js.map +1 -1
  188. package/dist/lang/parse-error.d.ts +7 -1
  189. package/dist/lang/parse-error.d.ts.map +1 -1
  190. package/dist/lang/parse-error.js.map +1 -1
  191. package/dist/lang/security-scanner.d.ts +9 -1
  192. package/dist/lang/security-scanner.d.ts.map +1 -1
  193. package/dist/lang/security-scanner.js +38 -1
  194. package/dist/lang/security-scanner.js.map +1 -1
  195. package/dist/lang/symbol-table.generated.d.ts +3 -0
  196. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  197. package/dist/lang/symbol-table.generated.js +3 -0
  198. package/dist/lang/symbol-table.generated.js.map +1 -1
  199. package/dist/mesh/io.d.ts +62 -9
  200. package/dist/mesh/io.d.ts.map +1 -1
  201. package/dist/mesh/io.js +124 -17
  202. package/dist/mesh/io.js.map +1 -1
  203. package/dist/mesh/threemf-loader.d.ts +15 -0
  204. package/dist/mesh/threemf-loader.d.ts.map +1 -0
  205. package/dist/mesh/threemf-loader.js +163 -0
  206. package/dist/mesh/threemf-loader.js.map +1 -0
  207. package/dist/mesh/transform.d.ts +2 -2
  208. package/dist/mesh/transform.d.ts.map +1 -1
  209. package/dist/mesh/transform.js +3 -3
  210. package/dist/mesh/transform.js.map +1 -1
  211. package/dist/mesh/types.d.ts +2 -2
  212. package/dist/mesh/types.d.ts.map +1 -1
  213. package/dist/mesh/types.js.map +1 -1
  214. package/dist/node-host/cli.d.ts.map +1 -1
  215. package/dist/node-host/cli.js +53 -26
  216. package/dist/node-host/cli.js.map +1 -1
  217. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  218. package/dist/occt-kernel/occtKernel.js +4 -2
  219. package/dist/occt-kernel/occtKernel.js.map +1 -1
  220. package/dist/occt-kernel/topologyExt.d.ts.map +1 -1
  221. package/dist/occt-kernel/topologyExt.js +4 -1
  222. package/dist/occt-kernel/topologyExt.js.map +1 -1
  223. package/dist/runtime-state.d.ts +18 -0
  224. package/dist/runtime-state.d.ts.map +1 -1
  225. package/dist/runtime-state.js +23 -0
  226. package/dist/runtime-state.js.map +1 -1
  227. package/dist/sdk.d.ts +1 -1
  228. package/dist/sdk.d.ts.map +1 -1
  229. package/dist/sdk.js +1 -1
  230. package/dist/sdk.js.map +1 -1
  231. package/dist/tolerance.d.ts +38 -0
  232. package/dist/tolerance.d.ts.map +1 -0
  233. package/dist/tolerance.js +40 -0
  234. package/dist/tolerance.js.map +1 -0
  235. package/dist/topology/naming/score.js +3 -3
  236. package/dist/topology/naming/score.js.map +1 -1
  237. package/dist/units.d.ts +248 -0
  238. package/dist/units.d.ts.map +1 -0
  239. package/dist/units.js +397 -0
  240. package/dist/units.js.map +1 -0
  241. package/package.json +19 -2
@@ -1 +1 @@
1
- {"version":3,"file":"csg-worker-protocol.d.ts","sourceRoot":"","sources":["../../src/browser-host/csg-worker-protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"csg-worker-protocol.d.ts","sourceRoot":"","sources":["../../src/browser-host/csg-worker-protocol.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"csg-worker-protocol.js","sourceRoot":"","sources":["../../src/browser-host/csg-worker-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG","sourcesContent":["/**\n * csg-worker 消息协议 — csg-worker.ts(Worker 侧)与 worker-csg-backend.ts(主线程侧)共享。\n *\n * 请求经 postMessage 结构化克隆传输;MeshData 的 Float32Array/Uint32Array 原样保持。\n * 每条请求带递增 id,响应以同一 id 关联(init 用 id 0)。\n */\n\nimport type { MeshData, PlaneParams, SplitResult } from '../cad-runtime/ports'\n\n/** Worker init handshake request; carries the manifold.wasm URL. */\nexport interface CsgWorkerInitRequest {\n id: number\n kind: 'init'\n /** manifold.wasm URL (undefined lets the worker use default resolution). */\n wasmUrl?: string\n}\n\n/** CSG boolean operation request executed on the worker. */\nexport interface CsgWorkerBooleanRequest {\n id: number\n kind: 'boolean'\n op: 'union' | 'subtract' | 'intersect'\n meshes: MeshData[]\n}\n\n/** Plane split request executed on the worker. */\nexport interface CsgWorkerSplitPlaneRequest {\n id: number\n kind: 'splitPlane'\n mesh: MeshData\n plane: PlaneParams\n}\n\n/** Dovetail split request executed on the worker. */\nexport interface CsgWorkerSplitDovetailRequest {\n id: number\n kind: 'splitDovetail'\n mesh: MeshData\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n bboxWidthOnWidthDir: number\n groove: import('../cad-runtime/ports').DovetailGrooveParams\n }\n}\n\n/** Dowel split request executed on the worker. */\nexport interface CsgWorkerSplitDowelRequest {\n id: number\n kind: 'splitDowel'\n mesh: MeshData\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n dowel: import('../cad-runtime/ports').DowelSplitParams\n selectedSections?: number[] | null\n }\n}\n\n/** Straight tenon split request executed on the worker. */\nexport interface CsgWorkerSplitTenonRequest {\n id: number\n kind: 'splitStraightTenon'\n mesh: MeshData\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n tenon: import('../cad-runtime/ports').StraightTenonSplitParams\n selectedSections?: number[] | null\n }\n}\n\n/** Discriminated union of every request the CSG worker can receive. */\nexport type CsgWorkerRequest =\n | CsgWorkerInitRequest\n | CsgWorkerBooleanRequest\n | CsgWorkerSplitPlaneRequest\n | CsgWorkerSplitDovetailRequest\n | CsgWorkerSplitDowelRequest\n | CsgWorkerSplitTenonRequest\n\n/** Discriminated union of every response the CSG worker can emit. */\nexport type CsgWorkerResponse =\n | { id: number; kind: 'init'; ok: true }\n | { id: number; kind: 'boolean'; ok: true; result: MeshData }\n | { id: number; kind: 'splitPlane'; ok: true; result: { front: MeshData; back: MeshData } }\n | { id: number; kind: 'splitDovetail' | 'splitDowel' | 'splitStraightTenon'; ok: true; result: SplitResult }\n | { id: number; kind: CsgWorkerRequest['kind']; ok: false; error: string }\n"]}
1
+ {"version":3,"file":"csg-worker-protocol.js","sourceRoot":"","sources":["../../src/browser-host/csg-worker-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG","sourcesContent":["/**\n * csg-worker 消息协议 — csg-worker.ts(Worker 侧)与 worker-csg-backend.ts(主线程侧)共享。\n *\n * 请求经 postMessage 结构化克隆传输;MeshData 的 Float32Array/Uint32Array 原样保持。\n * 每条请求带递增 id,响应以同一 id 关联(init 用 id 0)。\n */\n\nimport type { MeshData, PlaneParams, SplitResult } from '../cad-runtime/ports'\n\n/** Worker init handshake request; carries the manifold.wasm URL. */\nexport interface CsgWorkerInitRequest {\n id: number\n kind: 'init'\n /** manifold.wasm URL (undefined lets the worker use default resolution). */\n wasmUrl?: string\n}\n\n/** CSG boolean operation request executed on the worker. */\nexport interface CsgWorkerBooleanRequest {\n id: number\n kind: 'boolean'\n op: 'union' | 'subtract' | 'intersect'\n meshes: MeshData[]\n}\n\n/** Plane split request executed on the worker. */\nexport interface CsgWorkerSplitPlaneRequest {\n id: number\n kind: 'splitPlane'\n mesh: MeshData\n plane: PlaneParams\n}\n\n/** Dovetail split request executed on the worker. */\nexport interface CsgWorkerSplitDovetailRequest {\n id: number\n kind: 'splitDovetail'\n mesh: MeshData\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n bboxWidthOnWidthDir: number\n groove: import('../cad-runtime/ports').DovetailGrooveParams\n }\n}\n\n/** Dowel split request executed on the worker. */\nexport interface CsgWorkerSplitDowelRequest {\n id: number\n kind: 'splitDowel'\n mesh: MeshData\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n dowel: import('../cad-runtime/ports').DowelSplitParams\n selectedSections?: number[] | null\n }\n}\n\n/** Straight tenon split request executed on the worker. */\nexport interface CsgWorkerSplitTenonRequest {\n id: number\n kind: 'splitStraightTenon'\n mesh: MeshData\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n tenon: import('../cad-runtime/ports').StraightTenonSplitParams\n selectedSections?: number[] | null\n }\n}\n\n/** Discriminated union of every request the CSG worker can receive. */\nexport type CsgWorkerRequest =\n | CsgWorkerInitRequest\n | CsgWorkerBooleanRequest\n | CsgWorkerSplitPlaneRequest\n | CsgWorkerSplitDovetailRequest\n | CsgWorkerSplitDowelRequest\n | CsgWorkerSplitTenonRequest\n\n/** Discriminated union of every response the CSG worker can emit. */\nexport type CsgWorkerResponse =\n | { id: number; kind: 'init'; ok: true }\n | { id: number; kind: 'boolean'; ok: true; result: MeshData }\n | { id: number; kind: 'splitPlane'; ok: true; result: { front: MeshData; back: MeshData } }\n | { id: number; kind: 'splitDovetail' | 'splitDowel' | 'splitStraightTenon'; ok: true; result: SplitResult }\n | { id: number; kind: CsgWorkerRequest['kind']; ok: false; error: string }\n"]}
@@ -43,14 +43,14 @@ async function handleRequest(req) {
43
43
  case 'splitDovetail': {
44
44
  const { Manifold, Mesh } = await getManifoldModule();
45
45
  const original = meshToManifold(Manifold, Mesh, req.mesh);
46
- const [upper, lower, wedgeData] = dovetailBooleanSplit(Manifold, Mesh, original, req.params.planeNormal, req.params.planeOriginOffset, req.params.planeCenter, req.params.widthDir, req.params.bboxWidthOnWidthDir, req.params.groove);
46
+ const [upper, lower, wedgeData] = dovetailBooleanSplit(Manifold, Mesh, original, req.params.planeNormal, req.params.planeDistance, req.params.planeCenter, req.params.widthDir, req.params.bboxWidthOnWidthDir, req.params.groove);
47
47
  const result = toSplitResult(upper, lower, wedgeData);
48
48
  return { id: req.id, kind: 'splitDovetail', ok: true, result };
49
49
  }
50
50
  case 'splitDowel': {
51
51
  const { Manifold, Mesh } = await getManifoldModule();
52
52
  const original = meshToManifold(Manifold, Mesh, req.mesh);
53
- const [upper, lower, shapeData] = dowelOrTenonBooleanSplit(Manifold, Mesh, original, req.params.planeNormal, req.params.planeOriginOffset, req.params.planeCenter, req.params.widthDir, 'dowel', {
53
+ const [upper, lower, shapeData] = dowelOrTenonBooleanSplit(Manifold, Mesh, original, req.params.planeNormal, req.params.planeDistance, req.params.planeCenter, req.params.widthDir, 'dowel', {
54
54
  size: req.params.dowel.diameter,
55
55
  sizeTolerance: req.params.dowel.diameterTolerance,
56
56
  height: req.params.dowel.height,
@@ -62,7 +62,7 @@ async function handleRequest(req) {
62
62
  case 'splitStraightTenon': {
63
63
  const { Manifold, Mesh } = await getManifoldModule();
64
64
  const original = meshToManifold(Manifold, Mesh, req.mesh);
65
- const [upper, lower, shapeData] = dowelOrTenonBooleanSplit(Manifold, Mesh, original, req.params.planeNormal, req.params.planeOriginOffset, req.params.planeCenter, req.params.widthDir, 'tenon', {
65
+ const [upper, lower, shapeData] = dowelOrTenonBooleanSplit(Manifold, Mesh, original, req.params.planeNormal, req.params.planeDistance, req.params.planeCenter, req.params.widthDir, 'tenon', {
66
66
  size: req.params.tenon.sideLength,
67
67
  sizeTolerance: req.params.tenon.sideLengthTolerance,
68
68
  height: req.params.tenon.height,
@@ -1 +1 @@
1
- {"version":3,"file":"csg-worker.js","sourceRoot":"","sources":["../../src/browser-host/csg-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,qBAAqB,CAAA;AAO5B,8DAA8D;AAC9D,MAAM,GAAG,GAAG,IAGX,CAAA;AAED,KAAK,UAAU,aAAa,CAAC,GAAqB;IAChD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,IAAI,GAAG,CAAC,OAAO;gBAAE,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAChD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QAE/C,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAA;YACpD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC1E,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;YAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE;gBAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;YAChE,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;YAC7C,MAAM,CAAC,MAAM,EAAE,CAAA;YACf,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;QACtE,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAA;YACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACjF,QAAQ,CAAC,MAAM,EAAE,CAAA;YACjB,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;YACxC,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;YACtC,MAAM,CAAC,MAAM,EAAE,CAAA;YACf,KAAK,CAAC,MAAM,EAAE,CAAA;YACd,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAA;QAC9E,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAA;YACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,oBAAoB,CACpD,QAAQ,EAAE,IAAI,EACd,QAAQ,EACR,GAAG,CAAC,MAAM,CAAC,WAAW,EACtB,GAAG,CAAC,MAAM,CAAC,iBAAiB,EAC5B,GAAG,CAAC,MAAM,CAAC,WAAW,EACtB,GAAG,CAAC,MAAM,CAAC,QAAQ,EACnB,GAAG,CAAC,MAAM,CAAC,mBAAmB,EAC9B,GAAG,CAAC,MAAM,CAAC,MAAM,CAClB,CAAA;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;YACrD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;QAChE,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAA;YACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,wBAAwB,CACxD,QAAQ,EAAE,IAAI,EACd,QAAQ,EACR,GAAG,CAAC,MAAM,CAAC,WAAW,EACtB,GAAG,CAAC,MAAM,CAAC,iBAAiB,EAC5B,GAAG,CAAC,MAAM,CAAC,WAAW,EACtB,GAAG,CAAC,MAAM,CAAC,QAAQ,EACnB,OAAO,EACP;gBACE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ;gBAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB;gBACjD,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;gBAC/B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe;aAClD,EACD,KAAK,EACL,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAC5B,CAAA;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;YACrD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;QAC7D,CAAC;QAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAA;YACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,wBAAwB,CACxD,QAAQ,EAAE,IAAI,EACd,QAAQ,EACR,GAAG,CAAC,MAAM,CAAC,WAAW,EACtB,GAAG,CAAC,MAAM,CAAC,iBAAiB,EAC5B,GAAG,CAAC,MAAM,CAAC,WAAW,EACtB,GAAG,CAAC,MAAM,CAAC,QAAQ,EACnB,OAAO,EACP;gBACE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU;gBACjC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB;gBACnD,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;gBAC/B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe;aAClD,EACD,KAAK,EACL,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAC5B,CAAA;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;YACrD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;QACrE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,KAA8C,EAC9C,KAA8C,EAC9C,SAA0B;IAE1B,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IACtC,KAAK,CAAC,MAAM,EAAE,CAAA;IACd,KAAK,CAAC,MAAM,EAAE,CAAA;IACd,OAAO;QACL,KAAK;QACL,IAAI;QACJ,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;KACzF,CAAA;AACH,CAAC;AAED,GAAG,CAAC,SAAS,GAAG,CAAC,EAAgB,EAAE,EAAE;IACnC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAwB,CAAA;IACvC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CACrB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAC7B,CAAC,GAAY,EAAE,EAAE;QACf,GAAG,CAAC,WAAW,CAAC;YACd,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAA;IACJ,CAAC,CACF,CAAA;AACH,CAAC,CAAA","sourcesContent":["/**\n * csg-worker — CSG 计算 Worker 入口\n *\n * 主线程的 WorkerCsgBackend 把布尔/分割任务经 postMessage 发到这里执行,\n * 避免 manifold WASM 计算阻塞 UI 线程。\n *\n * 计算逻辑与 InlineCsgBackend 共用 csg-core 的同一套纯函数(构造器注入),\n * 双后端一致性由设计保证。\n *\n * 首次使用前必须先收到 init 消息(携带 wasm 地址),之后才处理计算任务。\n */\n\nimport { setManifoldWasmUrl, getManifoldModule } from '../mesh/manifold-loader'\nimport {\n manifoldToMeshData,\n meshToManifold,\n chainBoolean,\n dovetailBooleanSplit,\n dowelOrTenonBooleanSplit,\n} from '../boolean/csg-core'\nimport type {\n CsgWorkerRequest,\n CsgWorkerResponse,\n} from './csg-worker-protocol'\nimport type { MeshData } from '../cad-runtime/ports'\n\n// tsconfig 用 DOM lib(无 WebWorker lib),这里显式声明 worker 侧的最小 API。\nconst ctx = self as unknown as {\n onmessage: ((ev: MessageEvent) => void) | null\n postMessage(message: unknown): void\n}\n\nasync function handleRequest(req: CsgWorkerRequest): Promise<CsgWorkerResponse> {\n switch (req.kind) {\n case 'init':\n if (req.wasmUrl) setManifoldWasmUrl(req.wasmUrl)\n return { id: req.id, kind: 'init', ok: true }\n\n case 'boolean': {\n const { Manifold, Mesh } = await getManifoldModule()\n const manifolds = req.meshes.map((m) => meshToManifold(Manifold, Mesh, m))\n const result = chainBoolean(req.op, manifolds)\n for (let i = 1; i < manifolds.length; i++) manifolds[i].delete()\n const resultData = manifoldToMeshData(result)\n result.delete()\n return { id: req.id, kind: 'boolean', ok: true, result: resultData }\n }\n\n case 'splitPlane': {\n const { Manifold, Mesh } = await getManifoldModule()\n const manifold = meshToManifold(Manifold, Mesh, req.mesh)\n const [frontM, backM] = manifold.splitByPlane(req.plane.normal, req.plane.offset)\n manifold.delete()\n const front = manifoldToMeshData(frontM)\n const back = manifoldToMeshData(backM)\n frontM.delete()\n backM.delete()\n return { id: req.id, kind: 'splitPlane', ok: true, result: { front, back } }\n }\n\n case 'splitDovetail': {\n const { Manifold, Mesh } = await getManifoldModule()\n const original = meshToManifold(Manifold, Mesh, req.mesh)\n const [upper, lower, wedgeData] = dovetailBooleanSplit(\n Manifold, Mesh,\n original,\n req.params.planeNormal,\n req.params.planeOriginOffset,\n req.params.planeCenter,\n req.params.widthDir,\n req.params.bboxWidthOnWidthDir,\n req.params.groove,\n )\n const result = toSplitResult(upper, lower, wedgeData)\n return { id: req.id, kind: 'splitDovetail', ok: true, result }\n }\n\n case 'splitDowel': {\n const { Manifold, Mesh } = await getManifoldModule()\n const original = meshToManifold(Manifold, Mesh, req.mesh)\n const [upper, lower, shapeData] = dowelOrTenonBooleanSplit(\n Manifold, Mesh,\n original,\n req.params.planeNormal,\n req.params.planeOriginOffset,\n req.params.planeCenter,\n req.params.widthDir,\n 'dowel',\n {\n size: req.params.dowel.diameter,\n sizeTolerance: req.params.dowel.diameterTolerance,\n height: req.params.dowel.height,\n heightTolerance: req.params.dowel.heightTolerance,\n },\n false,\n req.params.selectedSections,\n )\n const result = toSplitResult(upper, lower, shapeData)\n return { id: req.id, kind: 'splitDowel', ok: true, result }\n }\n\n case 'splitStraightTenon': {\n const { Manifold, Mesh } = await getManifoldModule()\n const original = meshToManifold(Manifold, Mesh, req.mesh)\n const [upper, lower, shapeData] = dowelOrTenonBooleanSplit(\n Manifold, Mesh,\n original,\n req.params.planeNormal,\n req.params.planeOriginOffset,\n req.params.planeCenter,\n req.params.widthDir,\n 'tenon',\n {\n size: req.params.tenon.sideLength,\n sizeTolerance: req.params.tenon.sideLengthTolerance,\n height: req.params.tenon.height,\n heightTolerance: req.params.tenon.heightTolerance,\n },\n false,\n req.params.selectedSections,\n )\n const result = toSplitResult(upper, lower, shapeData)\n return { id: req.id, kind: 'splitStraightTenon', ok: true, result }\n }\n }\n}\n\nfunction toSplitResult(\n upper: import('manifold-3d/manifold').Manifold,\n lower: import('manifold-3d/manifold').Manifold,\n shapeData: MeshData | null,\n): { front: MeshData; back: MeshData; wedge: MeshData | null } {\n const front = manifoldToMeshData(upper)\n const back = manifoldToMeshData(lower)\n upper.delete()\n lower.delete()\n return {\n front,\n back,\n wedge: shapeData ? { positions: shapeData.positions, indices: shapeData.indices } : null,\n }\n}\n\nctx.onmessage = (ev: MessageEvent) => {\n const req = ev.data as CsgWorkerRequest\n handleRequest(req).then(\n (res) => ctx.postMessage(res),\n (err: unknown) => {\n ctx.postMessage({\n id: req.id,\n kind: req.kind,\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n })\n },\n )\n}\n"]}
1
+ {"version":3,"file":"csg-worker.js","sourceRoot":"","sources":["../../src/browser-host/csg-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,qBAAqB,CAAA;AAO5B,8DAA8D;AAC9D,MAAM,GAAG,GAAG,IAGX,CAAA;AAED,KAAK,UAAU,aAAa,CAAC,GAAqB;IAChD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,IAAI,GAAG,CAAC,OAAO;gBAAE,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAChD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QAE/C,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAA;YACpD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC1E,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;YAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE;gBAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;YAChE,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;YAC7C,MAAM,CAAC,MAAM,EAAE,CAAA;YACf,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;QACtE,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAA;YACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACjF,QAAQ,CAAC,MAAM,EAAE,CAAA;YACjB,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;YACxC,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;YACtC,MAAM,CAAC,MAAM,EAAE,CAAA;YACf,KAAK,CAAC,MAAM,EAAE,CAAA;YACd,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAA;QAC9E,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAA;YACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,oBAAoB,CACpD,QAAQ,EAAE,IAAI,EACd,QAAQ,EACR,GAAG,CAAC,MAAM,CAAC,WAAW,EACtB,GAAG,CAAC,MAAM,CAAC,aAAa,EACxB,GAAG,CAAC,MAAM,CAAC,WAAW,EACtB,GAAG,CAAC,MAAM,CAAC,QAAQ,EACnB,GAAG,CAAC,MAAM,CAAC,mBAAmB,EAC9B,GAAG,CAAC,MAAM,CAAC,MAAM,CAClB,CAAA;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;YACrD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;QAChE,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAA;YACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,wBAAwB,CACxD,QAAQ,EAAE,IAAI,EACd,QAAQ,EACR,GAAG,CAAC,MAAM,CAAC,WAAW,EACtB,GAAG,CAAC,MAAM,CAAC,aAAa,EACxB,GAAG,CAAC,MAAM,CAAC,WAAW,EACtB,GAAG,CAAC,MAAM,CAAC,QAAQ,EACnB,OAAO,EACP;gBACE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ;gBAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB;gBACjD,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;gBAC/B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe;aAClD,EACD,KAAK,EACL,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAC5B,CAAA;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;YACrD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;QAC7D,CAAC;QAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAA;YACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;YACzD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,wBAAwB,CACxD,QAAQ,EAAE,IAAI,EACd,QAAQ,EACR,GAAG,CAAC,MAAM,CAAC,WAAW,EACtB,GAAG,CAAC,MAAM,CAAC,aAAa,EACxB,GAAG,CAAC,MAAM,CAAC,WAAW,EACtB,GAAG,CAAC,MAAM,CAAC,QAAQ,EACnB,OAAO,EACP;gBACE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU;gBACjC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB;gBACnD,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;gBAC/B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe;aAClD,EACD,KAAK,EACL,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAC5B,CAAA;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;YACrD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;QACrE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,KAA8C,EAC9C,KAA8C,EAC9C,SAA0B;IAE1B,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IACtC,KAAK,CAAC,MAAM,EAAE,CAAA;IACd,KAAK,CAAC,MAAM,EAAE,CAAA;IACd,OAAO;QACL,KAAK;QACL,IAAI;QACJ,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;KACzF,CAAA;AACH,CAAC;AAED,GAAG,CAAC,SAAS,GAAG,CAAC,EAAgB,EAAE,EAAE;IACnC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAwB,CAAA;IACvC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CACrB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAC7B,CAAC,GAAY,EAAE,EAAE;QACf,GAAG,CAAC,WAAW,CAAC;YACd,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAA;IACJ,CAAC,CACF,CAAA;AACH,CAAC,CAAA","sourcesContent":["/**\n * csg-worker — CSG 计算 Worker 入口\n *\n * 主线程的 WorkerCsgBackend 把布尔/分割任务经 postMessage 发到这里执行,\n * 避免 manifold WASM 计算阻塞 UI 线程。\n *\n * 计算逻辑与 InlineCsgBackend 共用 csg-core 的同一套纯函数(构造器注入),\n * 双后端一致性由设计保证。\n *\n * 首次使用前必须先收到 init 消息(携带 wasm 地址),之后才处理计算任务。\n */\n\nimport { setManifoldWasmUrl, getManifoldModule } from '../mesh/manifold-loader'\nimport {\n manifoldToMeshData,\n meshToManifold,\n chainBoolean,\n dovetailBooleanSplit,\n dowelOrTenonBooleanSplit,\n} from '../boolean/csg-core'\nimport type {\n CsgWorkerRequest,\n CsgWorkerResponse,\n} from './csg-worker-protocol'\nimport type { MeshData } from '../cad-runtime/ports'\n\n// tsconfig 用 DOM lib(无 WebWorker lib),这里显式声明 worker 侧的最小 API。\nconst ctx = self as unknown as {\n onmessage: ((ev: MessageEvent) => void) | null\n postMessage(message: unknown): void\n}\n\nasync function handleRequest(req: CsgWorkerRequest): Promise<CsgWorkerResponse> {\n switch (req.kind) {\n case 'init':\n if (req.wasmUrl) setManifoldWasmUrl(req.wasmUrl)\n return { id: req.id, kind: 'init', ok: true }\n\n case 'boolean': {\n const { Manifold, Mesh } = await getManifoldModule()\n const manifolds = req.meshes.map((m) => meshToManifold(Manifold, Mesh, m))\n const result = chainBoolean(req.op, manifolds)\n for (let i = 1; i < manifolds.length; i++) manifolds[i].delete()\n const resultData = manifoldToMeshData(result)\n result.delete()\n return { id: req.id, kind: 'boolean', ok: true, result: resultData }\n }\n\n case 'splitPlane': {\n const { Manifold, Mesh } = await getManifoldModule()\n const manifold = meshToManifold(Manifold, Mesh, req.mesh)\n const [frontM, backM] = manifold.splitByPlane(req.plane.normal, req.plane.offset)\n manifold.delete()\n const front = manifoldToMeshData(frontM)\n const back = manifoldToMeshData(backM)\n frontM.delete()\n backM.delete()\n return { id: req.id, kind: 'splitPlane', ok: true, result: { front, back } }\n }\n\n case 'splitDovetail': {\n const { Manifold, Mesh } = await getManifoldModule()\n const original = meshToManifold(Manifold, Mesh, req.mesh)\n const [upper, lower, wedgeData] = dovetailBooleanSplit(\n Manifold, Mesh,\n original,\n req.params.planeNormal,\n req.params.planeDistance,\n req.params.planeCenter,\n req.params.widthDir,\n req.params.bboxWidthOnWidthDir,\n req.params.groove,\n )\n const result = toSplitResult(upper, lower, wedgeData)\n return { id: req.id, kind: 'splitDovetail', ok: true, result }\n }\n\n case 'splitDowel': {\n const { Manifold, Mesh } = await getManifoldModule()\n const original = meshToManifold(Manifold, Mesh, req.mesh)\n const [upper, lower, shapeData] = dowelOrTenonBooleanSplit(\n Manifold, Mesh,\n original,\n req.params.planeNormal,\n req.params.planeDistance,\n req.params.planeCenter,\n req.params.widthDir,\n 'dowel',\n {\n size: req.params.dowel.diameter,\n sizeTolerance: req.params.dowel.diameterTolerance,\n height: req.params.dowel.height,\n heightTolerance: req.params.dowel.heightTolerance,\n },\n false,\n req.params.selectedSections,\n )\n const result = toSplitResult(upper, lower, shapeData)\n return { id: req.id, kind: 'splitDowel', ok: true, result }\n }\n\n case 'splitStraightTenon': {\n const { Manifold, Mesh } = await getManifoldModule()\n const original = meshToManifold(Manifold, Mesh, req.mesh)\n const [upper, lower, shapeData] = dowelOrTenonBooleanSplit(\n Manifold, Mesh,\n original,\n req.params.planeNormal,\n req.params.planeDistance,\n req.params.planeCenter,\n req.params.widthDir,\n 'tenon',\n {\n size: req.params.tenon.sideLength,\n sizeTolerance: req.params.tenon.sideLengthTolerance,\n height: req.params.tenon.height,\n heightTolerance: req.params.tenon.heightTolerance,\n },\n false,\n req.params.selectedSections,\n )\n const result = toSplitResult(upper, lower, shapeData)\n return { id: req.id, kind: 'splitStraightTenon', ok: true, result }\n }\n }\n}\n\nfunction toSplitResult(\n upper: import('manifold-3d/manifold').Manifold,\n lower: import('manifold-3d/manifold').Manifold,\n shapeData: MeshData | null,\n): { front: MeshData; back: MeshData; wedge: MeshData | null } {\n const front = manifoldToMeshData(upper)\n const back = manifoldToMeshData(lower)\n upper.delete()\n lower.delete()\n return {\n front,\n back,\n wedge: shapeData ? { positions: shapeData.positions, indices: shapeData.indices } : null,\n }\n}\n\nctx.onmessage = (ev: MessageEvent) => {\n const req = ev.data as CsgWorkerRequest\n handleRequest(req).then(\n (res) => ctx.postMessage(res),\n (err: unknown) => {\n ctx.postMessage({\n id: req.id,\n kind: req.kind,\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n })\n },\n )\n}\n"]}
@@ -30,7 +30,7 @@ export declare class InlineCsgBackend implements CsgBackend {
30
30
  }>;
31
31
  splitDovetail(mesh: MeshData, params: {
32
32
  planeNormal: [number, number, number];
33
- planeOriginOffset: number;
33
+ planeDistance: number;
34
34
  planeCenter: [number, number, number];
35
35
  widthDir: [number, number, number];
36
36
  bboxWidthOnWidthDir: number;
@@ -38,7 +38,7 @@ export declare class InlineCsgBackend implements CsgBackend {
38
38
  }): Promise<SplitResult>;
39
39
  splitDowel(mesh: MeshData, params: {
40
40
  planeNormal: [number, number, number];
41
- planeOriginOffset: number;
41
+ planeDistance: number;
42
42
  planeCenter: [number, number, number];
43
43
  widthDir: [number, number, number];
44
44
  dowel: import('../cad-runtime/ports.js').DowelSplitParams;
@@ -46,7 +46,7 @@ export declare class InlineCsgBackend implements CsgBackend {
46
46
  }): Promise<SplitResult>;
47
47
  splitStraightTenon(mesh: MeshData, params: {
48
48
  planeNormal: [number, number, number];
49
- planeOriginOffset: number;
49
+ planeDistance: number;
50
50
  planeCenter: [number, number, number];
51
51
  widthDir: [number, number, number];
52
52
  tenon: import('../cad-runtime/ports.js').StraightTenonSplitParams;
@@ -1 +1 @@
1
- {"version":3,"file":"inline-csg-backend.d.ts","sourceRoot":"","sources":["../../src/browser-host/inline-csg-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAmB1F;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IAC3C,OAAO,CAAC,EAAE,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAetF,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC;IAc5F,aAAa,CACjB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,iBAAiB,EAAE,MAAM,CAAA;QACzB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,mBAAmB,EAAE,MAAM,CAAA;QAC3B,MAAM,EAAE,OAAO,sBAAsB,EAAE,oBAAoB,CAAA;KAC5D,GACA,OAAO,CAAC,WAAW,CAAC;IA2BjB,UAAU,CACd,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,iBAAiB,EAAE,MAAM,CAAA;QACzB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,KAAK,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;QACtD,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KACnC,GACA,OAAO,CAAC,WAAW,CAAC;IAkCjB,kBAAkB,CACtB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,iBAAiB,EAAE,MAAM,CAAA;QACzB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,KAAK,EAAE,OAAO,sBAAsB,EAAE,wBAAwB,CAAA;QAC9D,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KACnC,GACA,OAAO,CAAC,WAAW,CAAC;CAiCxB"}
1
+ {"version":3,"file":"inline-csg-backend.d.ts","sourceRoot":"","sources":["../../src/browser-host/inline-csg-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAmB1F;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IAC3C,OAAO,CAAC,EAAE,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAetF,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC;IAc5F,aAAa,CACjB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,mBAAmB,EAAE,MAAM,CAAA;QAC3B,MAAM,EAAE,OAAO,sBAAsB,EAAE,oBAAoB,CAAA;KAC5D,GACA,OAAO,CAAC,WAAW,CAAC;IA2BjB,UAAU,CACd,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,KAAK,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;QACtD,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KACnC,GACA,OAAO,CAAC,WAAW,CAAC;IAkCjB,kBAAkB,CACtB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,KAAK,EAAE,OAAO,sBAAsB,EAAE,wBAAwB,CAAA;QAC9D,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KACnC,GACA,OAAO,CAAC,WAAW,CAAC;CAiCxB"}
@@ -57,7 +57,7 @@ export class InlineCsgBackend {
57
57
  async splitDovetail(mesh, params) {
58
58
  const { Manifold, Mesh } = await getManifoldModule();
59
59
  const original = await toManifold(mesh);
60
- const [upperManifold, lowerManifold, wedgeMeshData] = dovetailBooleanSplit(Manifold, Mesh, original, params.planeNormal, params.planeOriginOffset, params.planeCenter, params.widthDir, params.bboxWidthOnWidthDir, params.groove);
60
+ const [upperManifold, lowerManifold, wedgeMeshData] = dovetailBooleanSplit(Manifold, Mesh, original, params.planeNormal, params.planeDistance, params.planeCenter, params.widthDir, params.bboxWidthOnWidthDir, params.groove);
61
61
  const front = manifoldToMeshData(upperManifold);
62
62
  const back = manifoldToMeshData(lowerManifold);
63
63
  upperManifold.delete();
@@ -71,7 +71,7 @@ export class InlineCsgBackend {
71
71
  async splitDowel(mesh, params) {
72
72
  const { Manifold, Mesh } = await getManifoldModule();
73
73
  const original = await toManifold(mesh);
74
- const [upperManifold, lowerManifold, shapeMeshData] = dowelOrTenonBooleanSplit(Manifold, Mesh, original, params.planeNormal, params.planeOriginOffset, params.planeCenter, params.widthDir, 'dowel', {
74
+ const [upperManifold, lowerManifold, shapeMeshData] = dowelOrTenonBooleanSplit(Manifold, Mesh, original, params.planeNormal, params.planeDistance, params.planeCenter, params.widthDir, 'dowel', {
75
75
  size: params.dowel.diameter,
76
76
  sizeTolerance: params.dowel.diameterTolerance,
77
77
  height: params.dowel.height,
@@ -90,7 +90,7 @@ export class InlineCsgBackend {
90
90
  async splitStraightTenon(mesh, params) {
91
91
  const { Manifold, Mesh } = await getManifoldModule();
92
92
  const original = await toManifold(mesh);
93
- const [upperManifold, lowerManifold, shapeMeshData] = dowelOrTenonBooleanSplit(Manifold, Mesh, original, params.planeNormal, params.planeOriginOffset, params.planeCenter, params.widthDir, 'tenon', {
93
+ const [upperManifold, lowerManifold, shapeMeshData] = dowelOrTenonBooleanSplit(Manifold, Mesh, original, params.planeNormal, params.planeDistance, params.planeCenter, params.widthDir, 'tenon', {
94
94
  size: params.tenon.sideLength,
95
95
  sizeTolerance: params.tenon.sideLengthTolerance,
96
96
  height: params.tenon.height,
@@ -1 +1 @@
1
- {"version":3,"file":"inline-csg-backend.js","sourceRoot":"","sources":["../../src/browser-host/inline-csg-backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * InlineCsgBackend — 主线程直跑 CSG 后端(manifold-3d)\n *\n * 浏览器和 Node 环境均可使用(manifold-3d 在两个环境都可用)。\n *\n * 与 browser 端 WorkerCsgBackend 的区别:\n * - 不使用 Web Worker(Node 环境没有浏览器 Worker API)\n * - 直接在主线程调用 manifold-3d 核心模块(经 manifold-loader)\n * - 性能权衡:阻塞主线程——CLI/CI 场景无 UI,可接受\n *\n * 正确性由\"双后端一致性\"保证:Inline 与 Worker 后端共用 csg-core 的\n * 同一套纯函数(构造器注入),两边调用路径一致。\n */\n\nimport type { CsgBackend, MeshData, PlaneParams, SplitResult } from '../cad-runtime/ports'\nimport {\n manifoldToMeshData,\n meshToManifold,\n chainBoolean,\n dovetailBooleanSplit,\n dowelOrTenonBooleanSplit,\n} from '../boolean/csg-core'\nimport { getManifoldModule } from '../mesh/manifold-loader'\n\n/**\n * Build a Manifold from raw mesh data: weld → ofMesh.\n * 与 WorkerCsgBackend 走同一实现(csg-core.meshToManifold)。\n */\nasync function toManifold(mesh: MeshData): Promise<import('manifold-3d/manifold').Manifold> {\n const { Manifold, Mesh } = await getManifoldModule()\n return meshToManifold(Manifold, Mesh, mesh)\n}\n\n/**\n * InlineCsgBackend is a CSG backend that runs manifold-3d on the main thread.\n *\n * It is usable in both browser and Node environments (manifold-3d works in\n * both). Unlike the WorkerCsgBackend it spawns no Web Worker and instead calls\n * the manifold-3d core directly through the manifold-loader, blocking the main\n * thread — acceptable for CLI/CI scenarios without a UI. Correctness is\n * guaranteed by sharing the same pure functions from csg-core as the worker\n * backend.\n */\nexport class InlineCsgBackend implements CsgBackend {\n async boolean(op: 'union' | 'subtract' | 'intersect', meshes: MeshData[]): Promise<MeshData> {\n const manifolds: import('manifold-3d/manifold').Manifold[] = []\n for (const m of meshes) {\n manifolds.push(await toManifold(m))\n }\n\n const result = chainBoolean(op, manifolds)\n\n for (let i = 1; i < manifolds.length; i++) manifolds[i].delete()\n\n const meshData = manifoldToMeshData(result)\n result.delete()\n return meshData\n }\n\n async splitPlane(mesh: MeshData, plane: PlaneParams): Promise<{ front: MeshData; back: MeshData }> {\n const manifold = await toManifold(mesh)\n\n const [frontM, backM] = manifold.splitByPlane(plane.normal, plane.offset)\n manifold.delete()\n\n const front = manifoldToMeshData(frontM)\n const back = manifoldToMeshData(backM)\n frontM.delete()\n backM.delete()\n\n return { front, back }\n }\n\n async splitDovetail(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n bboxWidthOnWidthDir: number\n groove: import('../cad-runtime/ports').DovetailGrooveParams\n },\n ): Promise<SplitResult> {\n const { Manifold, Mesh } = await getManifoldModule()\n const original = await toManifold(mesh)\n\n const [upperManifold, lowerManifold, wedgeMeshData] = dovetailBooleanSplit(\n Manifold, Mesh,\n original,\n params.planeNormal,\n params.planeOriginOffset,\n params.planeCenter,\n params.widthDir,\n params.bboxWidthOnWidthDir,\n params.groove,\n )\n\n const front = manifoldToMeshData(upperManifold)\n const back = manifoldToMeshData(lowerManifold)\n upperManifold.delete()\n lowerManifold.delete()\n\n return {\n front,\n back,\n wedge: wedgeMeshData ? { positions: wedgeMeshData.positions, indices: wedgeMeshData.indices } : null,\n }\n }\n\n async splitDowel(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n dowel: import('../cad-runtime/ports').DowelSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult> {\n const { Manifold, Mesh } = await getManifoldModule()\n const original = await toManifold(mesh)\n\n const [upperManifold, lowerManifold, shapeMeshData] = dowelOrTenonBooleanSplit(\n Manifold, Mesh,\n original,\n params.planeNormal,\n params.planeOriginOffset,\n params.planeCenter,\n params.widthDir,\n 'dowel',\n {\n size: params.dowel.diameter,\n sizeTolerance: params.dowel.diameterTolerance,\n height: params.dowel.height,\n heightTolerance: params.dowel.heightTolerance,\n },\n false,\n params.selectedSections,\n )\n\n const front = manifoldToMeshData(upperManifold)\n const back = manifoldToMeshData(lowerManifold)\n upperManifold.delete()\n lowerManifold.delete()\n\n return {\n front,\n back,\n wedge: shapeMeshData ? { positions: shapeMeshData.positions, indices: shapeMeshData.indices } : null,\n }\n }\n\n async splitStraightTenon(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n tenon: import('../cad-runtime/ports').StraightTenonSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult> {\n const { Manifold, Mesh } = await getManifoldModule()\n const original = await toManifold(mesh)\n\n const [upperManifold, lowerManifold, shapeMeshData] = dowelOrTenonBooleanSplit(\n Manifold, Mesh,\n original,\n params.planeNormal,\n params.planeOriginOffset,\n params.planeCenter,\n params.widthDir,\n 'tenon',\n {\n size: params.tenon.sideLength,\n sizeTolerance: params.tenon.sideLengthTolerance,\n height: params.tenon.height,\n heightTolerance: params.tenon.heightTolerance,\n },\n false,\n params.selectedSections,\n )\n\n const front = manifoldToMeshData(upperManifold)\n const back = manifoldToMeshData(lowerManifold)\n upperManifold.delete()\n lowerManifold.delete()\n\n return {\n front,\n back,\n wedge: shapeMeshData ? { positions: shapeMeshData.positions, indices: shapeMeshData.indices } : null,\n }\n }\n}\n"]}
1
+ {"version":3,"file":"inline-csg-backend.js","sourceRoot":"","sources":["../../src/browser-host/inline-csg-backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * InlineCsgBackend — 主线程直跑 CSG 后端(manifold-3d)\n *\n * 浏览器和 Node 环境均可使用(manifold-3d 在两个环境都可用)。\n *\n * 与 browser 端 WorkerCsgBackend 的区别:\n * - 不使用 Web Worker(Node 环境没有浏览器 Worker API)\n * - 直接在主线程调用 manifold-3d 核心模块(经 manifold-loader)\n * - 性能权衡:阻塞主线程——CLI/CI 场景无 UI,可接受\n *\n * 正确性由\"双后端一致性\"保证:Inline 与 Worker 后端共用 csg-core 的\n * 同一套纯函数(构造器注入),两边调用路径一致。\n */\n\nimport type { CsgBackend, MeshData, PlaneParams, SplitResult } from '../cad-runtime/ports'\nimport {\n manifoldToMeshData,\n meshToManifold,\n chainBoolean,\n dovetailBooleanSplit,\n dowelOrTenonBooleanSplit,\n} from '../boolean/csg-core'\nimport { getManifoldModule } from '../mesh/manifold-loader'\n\n/**\n * Build a Manifold from raw mesh data: weld → ofMesh.\n * 与 WorkerCsgBackend 走同一实现(csg-core.meshToManifold)。\n */\nasync function toManifold(mesh: MeshData): Promise<import('manifold-3d/manifold').Manifold> {\n const { Manifold, Mesh } = await getManifoldModule()\n return meshToManifold(Manifold, Mesh, mesh)\n}\n\n/**\n * InlineCsgBackend is a CSG backend that runs manifold-3d on the main thread.\n *\n * It is usable in both browser and Node environments (manifold-3d works in\n * both). Unlike the WorkerCsgBackend it spawns no Web Worker and instead calls\n * the manifold-3d core directly through the manifold-loader, blocking the main\n * thread — acceptable for CLI/CI scenarios without a UI. Correctness is\n * guaranteed by sharing the same pure functions from csg-core as the worker\n * backend.\n */\nexport class InlineCsgBackend implements CsgBackend {\n async boolean(op: 'union' | 'subtract' | 'intersect', meshes: MeshData[]): Promise<MeshData> {\n const manifolds: import('manifold-3d/manifold').Manifold[] = []\n for (const m of meshes) {\n manifolds.push(await toManifold(m))\n }\n\n const result = chainBoolean(op, manifolds)\n\n for (let i = 1; i < manifolds.length; i++) manifolds[i].delete()\n\n const meshData = manifoldToMeshData(result)\n result.delete()\n return meshData\n }\n\n async splitPlane(mesh: MeshData, plane: PlaneParams): Promise<{ front: MeshData; back: MeshData }> {\n const manifold = await toManifold(mesh)\n\n const [frontM, backM] = manifold.splitByPlane(plane.normal, plane.offset)\n manifold.delete()\n\n const front = manifoldToMeshData(frontM)\n const back = manifoldToMeshData(backM)\n frontM.delete()\n backM.delete()\n\n return { front, back }\n }\n\n async splitDovetail(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n bboxWidthOnWidthDir: number\n groove: import('../cad-runtime/ports').DovetailGrooveParams\n },\n ): Promise<SplitResult> {\n const { Manifold, Mesh } = await getManifoldModule()\n const original = await toManifold(mesh)\n\n const [upperManifold, lowerManifold, wedgeMeshData] = dovetailBooleanSplit(\n Manifold, Mesh,\n original,\n params.planeNormal,\n params.planeDistance,\n params.planeCenter,\n params.widthDir,\n params.bboxWidthOnWidthDir,\n params.groove,\n )\n\n const front = manifoldToMeshData(upperManifold)\n const back = manifoldToMeshData(lowerManifold)\n upperManifold.delete()\n lowerManifold.delete()\n\n return {\n front,\n back,\n wedge: wedgeMeshData ? { positions: wedgeMeshData.positions, indices: wedgeMeshData.indices } : null,\n }\n }\n\n async splitDowel(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n dowel: import('../cad-runtime/ports').DowelSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult> {\n const { Manifold, Mesh } = await getManifoldModule()\n const original = await toManifold(mesh)\n\n const [upperManifold, lowerManifold, shapeMeshData] = dowelOrTenonBooleanSplit(\n Manifold, Mesh,\n original,\n params.planeNormal,\n params.planeDistance,\n params.planeCenter,\n params.widthDir,\n 'dowel',\n {\n size: params.dowel.diameter,\n sizeTolerance: params.dowel.diameterTolerance,\n height: params.dowel.height,\n heightTolerance: params.dowel.heightTolerance,\n },\n false,\n params.selectedSections,\n )\n\n const front = manifoldToMeshData(upperManifold)\n const back = manifoldToMeshData(lowerManifold)\n upperManifold.delete()\n lowerManifold.delete()\n\n return {\n front,\n back,\n wedge: shapeMeshData ? { positions: shapeMeshData.positions, indices: shapeMeshData.indices } : null,\n }\n }\n\n async splitStraightTenon(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n tenon: import('../cad-runtime/ports').StraightTenonSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult> {\n const { Manifold, Mesh } = await getManifoldModule()\n const original = await toManifold(mesh)\n\n const [upperManifold, lowerManifold, shapeMeshData] = dowelOrTenonBooleanSplit(\n Manifold, Mesh,\n original,\n params.planeNormal,\n params.planeDistance,\n params.planeCenter,\n params.widthDir,\n 'tenon',\n {\n size: params.tenon.sideLength,\n sizeTolerance: params.tenon.sideLengthTolerance,\n height: params.tenon.height,\n heightTolerance: params.tenon.heightTolerance,\n },\n false,\n params.selectedSections,\n )\n\n const front = manifoldToMeshData(upperManifold)\n const back = manifoldToMeshData(lowerManifold)\n upperManifold.delete()\n lowerManifold.delete()\n\n return {\n front,\n back,\n wedge: shapeMeshData ? { positions: shapeMeshData.positions, indices: shapeMeshData.indices } : null,\n }\n }\n}\n"]}
@@ -35,7 +35,7 @@ export declare class WorkerCsgBackend implements CsgBackend {
35
35
  }>;
36
36
  splitDovetail(mesh: MeshData, params: {
37
37
  planeNormal: [number, number, number];
38
- planeOriginOffset: number;
38
+ planeDistance: number;
39
39
  planeCenter: [number, number, number];
40
40
  widthDir: [number, number, number];
41
41
  bboxWidthOnWidthDir: number;
@@ -43,7 +43,7 @@ export declare class WorkerCsgBackend implements CsgBackend {
43
43
  }): Promise<SplitResult>;
44
44
  splitDowel(mesh: MeshData, params: {
45
45
  planeNormal: [number, number, number];
46
- planeOriginOffset: number;
46
+ planeDistance: number;
47
47
  planeCenter: [number, number, number];
48
48
  widthDir: [number, number, number];
49
49
  dowel: import('../cad-runtime/ports.js').DowelSplitParams;
@@ -51,7 +51,7 @@ export declare class WorkerCsgBackend implements CsgBackend {
51
51
  }): Promise<SplitResult>;
52
52
  splitStraightTenon(mesh: MeshData, params: {
53
53
  planeNormal: [number, number, number];
54
- planeOriginOffset: number;
54
+ planeDistance: number;
55
55
  planeCenter: [number, number, number];
56
56
  widthDir: [number, number, number];
57
57
  tenon: import('../cad-runtime/ports.js').StraightTenonSplitParams;
@@ -1 +1 @@
1
- {"version":3,"file":"worker-csg-backend.d.ts","sourceRoot":"","sources":["../../src/browser-host/worker-csg-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAY1F;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,WAAW,CAAe;;IAelC,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,IAAI;YAOE,IAAI;IAQZ,OAAO,CAAC,EAAE,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAOtF,UAAU,CACd,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC;QAAE,KAAK,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC;IAOzC,aAAa,CACjB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,iBAAiB,EAAE,MAAM,CAAA;QACzB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,mBAAmB,EAAE,MAAM,CAAA;QAC3B,MAAM,EAAE,OAAO,sBAAsB,EAAE,oBAAoB,CAAA;KAC5D,GACA,OAAO,CAAC,WAAW,CAAC;IASjB,UAAU,CACd,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,iBAAiB,EAAE,MAAM,CAAA;QACzB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,KAAK,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;QACtD,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KACnC,GACA,OAAO,CAAC,WAAW,CAAC;IASjB,kBAAkB,CACtB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,iBAAiB,EAAE,MAAM,CAAA;QACzB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,KAAK,EAAE,OAAO,sBAAsB,EAAE,wBAAwB,CAAA;QAC9D,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KACnC,GACA,OAAO,CAAC,WAAW,CAAC;IASvB,8CAA8C;IAC9C,SAAS,IAAI,IAAI;CAIlB"}
1
+ {"version":3,"file":"worker-csg-backend.d.ts","sourceRoot":"","sources":["../../src/browser-host/worker-csg-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAY1F;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,WAAW,CAAe;;IAelC,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,IAAI;YAOE,IAAI;IAQZ,OAAO,CAAC,EAAE,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAOtF,UAAU,CACd,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC;QAAE,KAAK,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC;IAOzC,aAAa,CACjB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,mBAAmB,EAAE,MAAM,CAAA;QAC3B,MAAM,EAAE,OAAO,sBAAsB,EAAE,oBAAoB,CAAA;KAC5D,GACA,OAAO,CAAC,WAAW,CAAC;IASjB,UAAU,CACd,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,KAAK,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;QACtD,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KACnC,GACA,OAAO,CAAC,WAAW,CAAC;IASjB,kBAAkB,CACtB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,KAAK,EAAE,OAAO,sBAAsB,EAAE,wBAAwB,CAAA;QAC9D,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KACnC,GACA,OAAO,CAAC,WAAW,CAAC;IASvB,8CAA8C;IAC9C,SAAS,IAAI,IAAI;CAIlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"worker-csg-backend.js","sourceRoot":"","sources":["../../src/browser-host/worker-csg-backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * WorkerCsgBackend — 经 Web Worker 跑 CSG 后端(csg-worker)\n *\n * 与 InlineCsgBackend 的行为一致(共用 csg-core 同一套纯函数),\n * 区别是 manifold WASM 计算在独立 Worker 线程执行,不阻塞 UI。\n *\n * 构造时即向 worker 发送 init 握手(携带 wasm 地址,取自 manifold-loader 的\n * setManifoldWasmUrl 配置),后续每个 op 自动等待握手完成。\n */\n\nimport type { CsgBackend, MeshData, PlaneParams, SplitResult } from '../cad-runtime/ports'\nimport type {\n CsgWorkerRequest,\n CsgWorkerResponse,\n} from './csg-worker-protocol'\nimport { getManifoldWasmUrl } from '../mesh/manifold-loader'\n\ninterface Pending {\n resolve: (result: unknown) => void\n reject: (err: Error) => void\n}\n\n/**\n * WorkerCsgBackend is a CSG backend that runs manifold-3d in a Web Worker.\n *\n * It behaves identically to the InlineCsgBackend (both share the same pure\n * functions from csg-core), except that the manifold WASM computation happens\n * on a dedicated worker thread so the UI is not blocked. The constructor sends\n * the init handshake carrying the worker's wasm URL immediately (read from the\n * manifold-loader configuration); every subsequent operation awaits that\n * handshake.\n */\nexport class WorkerCsgBackend implements CsgBackend {\n private worker: Worker\n private nextId = 1\n private pending = new Map<number, Pending>()\n private initPromise: Promise<void>\n\n constructor() {\n this.worker = new Worker(new URL('./csg-worker.ts', import.meta.url), { type: 'module' })\n this.worker.onmessage = (ev: MessageEvent<CsgWorkerResponse>) => {\n this.handleMessage(ev.data)\n }\n this.worker.onerror = (ev) => {\n const err = new Error(`CSG worker 错误:${ev.message || '未知错误'}`)\n this.rejectAll(err)\n }\n this.initPromise = this.post({ id: 0, kind: 'init', wasmUrl: getManifoldWasmUrl() })\n .then(() => undefined)\n }\n\n private handleMessage(res: CsgWorkerResponse): void {\n const pending = this.pending.get(res.id)\n if (!pending) return\n this.pending.delete(res.id)\n if (res.ok) {\n pending.resolve(res)\n } else {\n pending.reject(new Error(res.error))\n }\n }\n\n private rejectAll(err: Error): void {\n for (const [, pending] of this.pending) pending.reject(err)\n this.pending.clear()\n }\n\n private post(req: CsgWorkerRequest): Promise<CsgWorkerResponse> {\n return new Promise<CsgWorkerResponse>((resolve, reject) => {\n this.pending.set(req.id, { resolve: resolve as Pending['resolve'], reject })\n this.worker.postMessage(req)\n })\n }\n\n private async call<T extends CsgWorkerResponse>(\n makeReq: (id: number) => CsgWorkerRequest,\n ): Promise<T> {\n await this.initPromise\n const res = (await this.post(makeReq(this.nextId++))) as T\n return res\n }\n\n async boolean(op: 'union' | 'subtract' | 'intersect', meshes: MeshData[]): Promise<MeshData> {\n const res = await this.call<Extract<CsgWorkerResponse, { kind: 'boolean'; ok: true }>>(\n (id) => ({ id, kind: 'boolean', op, meshes }),\n )\n return res.result\n }\n\n async splitPlane(\n mesh: MeshData,\n plane: PlaneParams,\n ): Promise<{ front: MeshData; back: MeshData }> {\n const res = await this.call<Extract<CsgWorkerResponse, { kind: 'splitPlane'; ok: true }>>(\n (id) => ({ id, kind: 'splitPlane', mesh, plane }),\n )\n return res.result\n }\n\n async splitDovetail(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n bboxWidthOnWidthDir: number\n groove: import('../cad-runtime/ports').DovetailGrooveParams\n },\n ): Promise<SplitResult> {\n const res = await this.call<\n Extract<CsgWorkerResponse, { kind: 'splitDovetail' | 'splitDowel' | 'splitStraightTenon'; ok: true }>\n >(\n (id) => ({ id, kind: 'splitDovetail', mesh, params }),\n )\n return res.result\n }\n\n async splitDowel(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n dowel: import('../cad-runtime/ports').DowelSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult> {\n const res = await this.call<\n Extract<CsgWorkerResponse, { kind: 'splitDovetail' | 'splitDowel' | 'splitStraightTenon'; ok: true }>\n >(\n (id) => ({ id, kind: 'splitDowel', mesh, params }),\n )\n return res.result\n }\n\n async splitStraightTenon(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n tenon: import('../cad-runtime/ports').StraightTenonSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult> {\n const res = await this.call<\n Extract<CsgWorkerResponse, { kind: 'splitDovetail' | 'splitDowel' | 'splitStraightTenon'; ok: true }>\n >(\n (id) => ({ id, kind: 'splitStraightTenon', mesh, params }),\n )\n return res.result\n }\n\n /** 终止 worker(宿主生命周期管理用;terminate 后本实例不可再用) */\n terminate(): void {\n this.rejectAll(new Error('CSG worker 已终止'))\n this.worker.terminate()\n }\n}\n"]}
1
+ {"version":3,"file":"worker-csg-backend.js","sourceRoot":"","sources":["../../src/browser-host/worker-csg-backend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * WorkerCsgBackend — 经 Web Worker 跑 CSG 后端(csg-worker)\n *\n * 与 InlineCsgBackend 的行为一致(共用 csg-core 同一套纯函数),\n * 区别是 manifold WASM 计算在独立 Worker 线程执行,不阻塞 UI。\n *\n * 构造时即向 worker 发送 init 握手(携带 wasm 地址,取自 manifold-loader 的\n * setManifoldWasmUrl 配置),后续每个 op 自动等待握手完成。\n */\n\nimport type { CsgBackend, MeshData, PlaneParams, SplitResult } from '../cad-runtime/ports'\nimport type {\n CsgWorkerRequest,\n CsgWorkerResponse,\n} from './csg-worker-protocol'\nimport { getManifoldWasmUrl } from '../mesh/manifold-loader'\n\ninterface Pending {\n resolve: (result: unknown) => void\n reject: (err: Error) => void\n}\n\n/**\n * WorkerCsgBackend is a CSG backend that runs manifold-3d in a Web Worker.\n *\n * It behaves identically to the InlineCsgBackend (both share the same pure\n * functions from csg-core), except that the manifold WASM computation happens\n * on a dedicated worker thread so the UI is not blocked. The constructor sends\n * the init handshake carrying the worker's wasm URL immediately (read from the\n * manifold-loader configuration); every subsequent operation awaits that\n * handshake.\n */\nexport class WorkerCsgBackend implements CsgBackend {\n private worker: Worker\n private nextId = 1\n private pending = new Map<number, Pending>()\n private initPromise: Promise<void>\n\n constructor() {\n this.worker = new Worker(new URL('./csg-worker.ts', import.meta.url), { type: 'module' })\n this.worker.onmessage = (ev: MessageEvent<CsgWorkerResponse>) => {\n this.handleMessage(ev.data)\n }\n this.worker.onerror = (ev) => {\n const err = new Error(`CSG worker 错误:${ev.message || '未知错误'}`)\n this.rejectAll(err)\n }\n this.initPromise = this.post({ id: 0, kind: 'init', wasmUrl: getManifoldWasmUrl() })\n .then(() => undefined)\n }\n\n private handleMessage(res: CsgWorkerResponse): void {\n const pending = this.pending.get(res.id)\n if (!pending) return\n this.pending.delete(res.id)\n if (res.ok) {\n pending.resolve(res)\n } else {\n pending.reject(new Error(res.error))\n }\n }\n\n private rejectAll(err: Error): void {\n for (const [, pending] of this.pending) pending.reject(err)\n this.pending.clear()\n }\n\n private post(req: CsgWorkerRequest): Promise<CsgWorkerResponse> {\n return new Promise<CsgWorkerResponse>((resolve, reject) => {\n this.pending.set(req.id, { resolve: resolve as Pending['resolve'], reject })\n this.worker.postMessage(req)\n })\n }\n\n private async call<T extends CsgWorkerResponse>(\n makeReq: (id: number) => CsgWorkerRequest,\n ): Promise<T> {\n await this.initPromise\n const res = (await this.post(makeReq(this.nextId++))) as T\n return res\n }\n\n async boolean(op: 'union' | 'subtract' | 'intersect', meshes: MeshData[]): Promise<MeshData> {\n const res = await this.call<Extract<CsgWorkerResponse, { kind: 'boolean'; ok: true }>>(\n (id) => ({ id, kind: 'boolean', op, meshes }),\n )\n return res.result\n }\n\n async splitPlane(\n mesh: MeshData,\n plane: PlaneParams,\n ): Promise<{ front: MeshData; back: MeshData }> {\n const res = await this.call<Extract<CsgWorkerResponse, { kind: 'splitPlane'; ok: true }>>(\n (id) => ({ id, kind: 'splitPlane', mesh, plane }),\n )\n return res.result\n }\n\n async splitDovetail(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n bboxWidthOnWidthDir: number\n groove: import('../cad-runtime/ports').DovetailGrooveParams\n },\n ): Promise<SplitResult> {\n const res = await this.call<\n Extract<CsgWorkerResponse, { kind: 'splitDovetail' | 'splitDowel' | 'splitStraightTenon'; ok: true }>\n >(\n (id) => ({ id, kind: 'splitDovetail', mesh, params }),\n )\n return res.result\n }\n\n async splitDowel(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n dowel: import('../cad-runtime/ports').DowelSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult> {\n const res = await this.call<\n Extract<CsgWorkerResponse, { kind: 'splitDovetail' | 'splitDowel' | 'splitStraightTenon'; ok: true }>\n >(\n (id) => ({ id, kind: 'splitDowel', mesh, params }),\n )\n return res.result\n }\n\n async splitStraightTenon(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n tenon: import('../cad-runtime/ports').StraightTenonSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult> {\n const res = await this.call<\n Extract<CsgWorkerResponse, { kind: 'splitDovetail' | 'splitDowel' | 'splitStraightTenon'; ok: true }>\n >(\n (id) => ({ id, kind: 'splitStraightTenon', mesh, params }),\n )\n return res.result\n }\n\n /** 终止 worker(宿主生命周期管理用;terminate 后本实例不可再用) */\n terminate(): void {\n this.rejectAll(new Error('CSG worker 已终止'))\n this.worker.terminate()\n }\n}\n"]}
@@ -152,10 +152,14 @@ export declare class DirectExecutor {
152
152
  private activeLine;
153
153
  /** P3:装配运动副位姿(成员名 → pose),collectDirectResult 消费。 */
154
154
  private kinematicsOut;
155
+ /** 文件声明单位(load op 登记,PartName → UnitName),collectDirectResult 消费。 */
156
+ private detectedUnitsOut;
155
157
  /** 执行后端(静态选定;缺省 vm) */
156
158
  private readonly execBackend;
157
159
  /** P3:读取装配运动副位姿快照(collectDirectResult 用;空 Map 表示无 joints)。 */
158
160
  get kinematicsSnapshot(): Map<PartName, AssemblyKinematicsPose>;
161
+ /** 文件声明单位快照(load op 语句执行后取走;空 Map 表示本批次无 load)。 */
162
+ get detectedUnitsSnapshot(): Map<PartName, string>;
159
163
  constructor(options: DirectExecutorOptions);
160
164
  /**
161
165
  * 热更新命名空间集合(registerLib 后)。
@@ -1 +1 @@
1
- {"version":3,"file":"direct-executor.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/direct-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"direct-executor.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/direct-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,OAAO,EAAwI,KAAK,sBAAsB,EAAwB,MAAM,kBAAkB,CAAA;AAI1N,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAG5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAItD,OAAO,KAAK,EAAgC,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AA0BrF;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAA;IAC7B,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAAA;CAC5C;AAID,uDAAuD;AACvD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+CAA+C;IAC/C,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAChC,oBAAoB;IACpB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,8BAA8B;IAC9B,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB;;;;OAIG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACpC;AAED,eAAe;AACf,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1D;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,oCAAoC;AACpC,MAAM,WAAW,SAAS;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAE9D,6BAA6B;AAC7B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACnB,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;CAC/B;AAID,4CAA4C;AAC5C,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,UAAU,EAAE,UAAU,CAAA;IACtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IAC1D,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7D,qEAAqE;IACrE,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/D,gEAAgE;IAChE,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAA;CAChC;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,kEAAkE;IAClE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAK;IAC1C,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,UAAU,CAAY;IAC9B,sBAAsB;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAiD;IAC/E,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAA4C;IAClF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAkD;IACpF,yBAAyB;IACzB,OAAO,CAAC,QAAQ,CAAK;IACrB,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,+BAA+B;IAC/B,OAAO,CAAC,UAAU,CAAoB;IACtC,qDAAqD;IACrD,OAAO,CAAC,aAAa,CAA8C;IACnE,qEAAqE;IACrE,OAAO,CAAC,gBAAgB,CAA8B;IACtD,uBAAuB;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAEzC,8DAA8D;IAC9D,IAAI,kBAAkB,IAAI,GAAG,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAE9D;IAED,mDAAmD;IACnD,IAAI,qBAAqB,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAEjD;gBAEW,OAAO,EAAE,qBAAqB;IAS1C;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAI3C;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIzD;;;OAGG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAI7C;;;OAGG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;;OAGG;IACH,IAAI,iBAAiB,IAAI,MAAM,EAAE,CAEhC;IAED;;;;;;;OAOG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAarE;;;;;OAKG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAKhG,8DAA8D;IAC9D,OAAO,CAAC,YAAY,CAA4B;IAEhD,mDAAmD;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4B;IAE1D,0DAA0D;IAC1D,OAAO,CAAC,UAAU,CAAoB;IAEtC;kEAC8D;IAC9D,OAAO,CAAC,QAAQ,CAA8B;IAE9C;iDAC6C;IAC7C,KAAK,IAAI,IAAI;IAYb;;;;;OAKG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAM9E;;;;;;OAMG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAM7E;;;;;;OAMG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIlG;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA6CpG;;;;OAIG;IACH,eAAe,IAAI,IAAI;YAOT,OAAO;IAqIrB;;;;;;;OAOG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAgBjF;;;;;OAKG;IACH,OAAO,CAAC,8BAA8B;IAmDtC,4CAA4C;YAC9B,OAAO;IAyBrB,6EAA6E;IAC7E,OAAO,CAAC,kBAAkB;IAe1B;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;IA2CjB,mBAAmB;IACnB,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,gBAAgB;IAkDxB;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;IAmBtB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,cAAc;IAyFtB,wEAAwE;IACxE,OAAO,CAAC,iBAAiB;IAmBzB,kDAAkD;IAClD,OAAO,CAAC,iBAAiB;IAiDzB,qCAAqC;IACrC,OAAO,CAAC,4BAA4B;IA0CpC,qFAAqF;IACrF,OAAO,CAAC,QAAQ;IAgChB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,eAAe;IAiBvB;;8CAE0C;IAC1C,OAAO,CAAC,YAAY;IASpB;uDACmD;IACnD,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,MAAM;IAId;wCACoC;IACpC,OAAO,CAAC,YAAY;IAqDpB;;mCAE+B;IAC/B,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,QAAQ;IAQhB;;;;OAIG;IACH,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAItC;;;;;OAKG;IACH,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAIvC;;;;OAIG;IACH,UAAU,IAAI,MAAM,EAAE,GAAG,SAAS;IAIlC,mCAAmC;IACnC,OAAO,CAAC,WAAW;CAkCpB"}
@@ -24,7 +24,7 @@
24
24
  import { parse as acornParse } from 'acorn';
25
25
  import { asPartName } from '../identity.js';
26
26
  import { ParseError } from '../lang/parse-error.js';
27
- import { setCurrentStmt, setKeepSink, setName, nameOf, takePendingAssemblyTransforms, takePendingAssemblyKinematics } from '../runtime-state.js';
27
+ import { setCurrentStmt, setKeepSink, setName, nameOf, takePendingAssemblyTransforms, takePendingAssemblyKinematics, takePendingDetectedUnits } from '../runtime-state.js';
28
28
  import { getBrepApi } from '../brep/handle-bridge.js';
29
29
  import { runtimeLineage } from '../topology/naming/lineage.js';
30
30
  import { ExecutionLimitError } from './execution-limit-error.js';
@@ -35,6 +35,7 @@ import { applyTransform } from '../mesh/rigid-transform.js';
35
35
  import { applyTransformBrep } from '../brep/brep-ops.js';
36
36
  import { VmBackend } from './exec-backends/vm-backend.js';
37
37
  import { InterpBackend } from './exec-backends/interp-backend.js';
38
+ import { SCRIPT_UNIT_NAMES } from '../units.js';
38
39
  /**
39
40
  * 几何值判定(isShape ∨ isMeshShape;与 define-op.isGeometryInput 同构)——
40
41
  * 裸调用原地写回(§3.7 规则 2)的运行时守卫:只有「返回值是几何 且 目标原值也是
@@ -76,12 +77,18 @@ export class DirectExecutor {
76
77
  activeLine;
77
78
  /** P3:装配运动副位姿(成员名 → pose),collectDirectResult 消费。 */
78
79
  kinematicsOut = new Map();
80
+ /** 文件声明单位(load op 登记,PartName → UnitName),collectDirectResult 消费。 */
81
+ detectedUnitsOut = new Map();
79
82
  /** 执行后端(静态选定;缺省 vm) */
80
83
  execBackend;
81
84
  /** P3:读取装配运动副位姿快照(collectDirectResult 用;空 Map 表示无 joints)。 */
82
85
  get kinematicsSnapshot() {
83
86
  return this.kinematicsOut;
84
87
  }
88
+ /** 文件声明单位快照(load op 语句执行后取走;空 Map 表示本批次无 load)。 */
89
+ get detectedUnitsSnapshot() {
90
+ return this.detectedUnitsOut;
91
+ }
85
92
  constructor(options) {
86
93
  this.namespaces = options.namespaces;
87
94
  this.setSolidHook = options.setSolid;
@@ -568,6 +575,11 @@ export class DirectExecutor {
568
575
  }
569
576
  finally {
570
577
  setCurrentStmt(undefined);
578
+ // 文件声明单位(load op 登记的 pending 元数据)按本语句收编。
579
+ const pendingUnits = takePendingDetectedUnits();
580
+ for (const [part, unit] of pendingUnits) {
581
+ this.detectedUnitsOut.set(part, unit);
582
+ }
571
583
  }
572
584
  }
573
585
  /** 行号 → 函数体 keep 登记(exec.keep/exec.keepHidden;与 live-shapes KeepView 对齐)。 */
@@ -1056,6 +1068,10 @@ export class DirectExecutor {
1056
1068
  case 'Literal':
1057
1069
  return JSON.stringify(node.value);
1058
1070
  case 'Identifier':
1071
+ // P6/D7: unit constants (MM, INCH, DEGREE, …) are global read-only
1072
+ // constants — emit as bare identifiers so they resolve from globalThis.
1073
+ if (SCRIPT_UNIT_NAMES.has(node.name))
1074
+ return node.name;
1059
1075
  return `__ctx.${node.name}`;
1060
1076
  case 'CallExpression':
1061
1077
  return this.emitCall(node, code, declared, lineNo);