@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.
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +4 -1
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/brep-mirror/joinery-brep.d.ts +1 -1
- package/dist/api/brep-mirror/joinery-brep.d.ts.map +1 -1
- package/dist/api/brep-mirror/joinery-brep.js +22 -20
- package/dist/api/brep-mirror/joinery-brep.js.map +1 -1
- package/dist/api/generated/script-face-manifest.d.ts +4 -0
- package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/index.d.ts +4 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +3 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/knurl.d.ts.map +1 -1
- package/dist/api/knurl.js +1 -0
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/primitives.d.ts +4 -3
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +9 -3
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/profile.d.ts +34 -5
- package/dist/api/profile.d.ts.map +1 -1
- package/dist/api/profile.js +168 -186
- package/dist/api/profile.js.map +1 -1
- package/dist/api/punch-hole.d.ts +77 -0
- package/dist/api/punch-hole.d.ts.map +1 -0
- package/dist/api/punch-hole.js +207 -0
- package/dist/api/punch-hole.js.map +1 -0
- package/dist/api/sketch-on-face.d.ts +85 -0
- package/dist/api/sketch-on-face.d.ts.map +1 -0
- package/dist/api/sketch-on-face.js +136 -0
- package/dist/api/sketch-on-face.js.map +1 -0
- package/dist/api/sketch-on-plane.d.ts +87 -0
- package/dist/api/sketch-on-plane.d.ts.map +1 -0
- package/dist/api/sketch-on-plane.js +106 -0
- package/dist/api/sketch-on-plane.js.map +1 -0
- package/dist/api/surface/arg-spec.d.ts +8 -0
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/transform.d.ts +5 -5
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +12 -10
- package/dist/api/transform.js.map +1 -1
- package/dist/api/xml-dom.d.ts +27 -0
- package/dist/api/xml-dom.d.ts.map +1 -0
- package/dist/api/xml-dom.js +45 -0
- package/dist/api/xml-dom.js.map +1 -0
- package/dist/boolean/csg-backend.d.ts +6 -6
- package/dist/boolean/csg-backend.d.ts.map +1 -1
- package/dist/boolean/csg-backend.js +9 -9
- package/dist/boolean/csg-backend.js.map +1 -1
- package/dist/boolean/csg-core.d.ts +10 -10
- package/dist/boolean/csg-core.d.ts.map +1 -1
- package/dist/boolean/csg-core.js +24 -24
- package/dist/boolean/csg-core.js.map +1 -1
- package/dist/boolean/extrude-helpers.d.ts +8 -8
- package/dist/boolean/extrude-helpers.d.ts.map +1 -1
- package/dist/boolean/extrude-helpers.js +13 -13
- package/dist/boolean/extrude-helpers.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +24 -10
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +46 -18
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.d.ts.map +1 -1
- package/dist/brep/brep-topology.js +3 -1
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/export/export-model.d.ts +79 -0
- package/dist/brep/export/export-model.d.ts.map +1 -0
- package/dist/brep/export/export-model.js +335 -0
- package/dist/brep/export/export-model.js.map +1 -0
- package/dist/brep/primitives-brep.d.ts.map +1 -1
- package/dist/brep/primitives-brep.js +3 -1
- package/dist/brep/primitives-brep.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +4 -2
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/browser-host/csg-worker-protocol.d.ts +3 -3
- package/dist/browser-host/csg-worker-protocol.d.ts.map +1 -1
- package/dist/browser-host/csg-worker-protocol.js.map +1 -1
- package/dist/browser-host/csg-worker.js +3 -3
- package/dist/browser-host/csg-worker.js.map +1 -1
- package/dist/browser-host/inline-csg-backend.d.ts +3 -3
- package/dist/browser-host/inline-csg-backend.d.ts.map +1 -1
- package/dist/browser-host/inline-csg-backend.js +3 -3
- package/dist/browser-host/inline-csg-backend.js.map +1 -1
- package/dist/browser-host/worker-csg-backend.d.ts +3 -3
- package/dist/browser-host/worker-csg-backend.d.ts.map +1 -1
- package/dist/browser-host/worker-csg-backend.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts +4 -0
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +17 -1
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +3 -3
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +24 -1
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +53 -3
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +22 -0
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +15 -0
- package/dist/define-op.js.map +1 -1
- package/dist/env-agnostic.d.ts +7 -7
- package/dist/env-agnostic.d.ts.map +1 -1
- package/dist/env-agnostic.js +3 -3
- package/dist/env-agnostic.js.map +1 -1
- package/dist/geometry2d/adapt.d.ts +46 -0
- package/dist/geometry2d/adapt.d.ts.map +1 -0
- package/dist/geometry2d/adapt.js +41 -0
- package/dist/geometry2d/adapt.js.map +1 -0
- package/dist/geometry2d/bbox2d.d.ts +82 -0
- package/dist/geometry2d/bbox2d.d.ts.map +1 -0
- package/dist/geometry2d/bbox2d.js +123 -0
- package/dist/geometry2d/bbox2d.js.map +1 -0
- package/dist/geometry2d/blueprint-sketcher.d.ts +27 -0
- package/dist/geometry2d/blueprint-sketcher.d.ts.map +1 -0
- package/dist/geometry2d/blueprint-sketcher.js +29 -0
- package/dist/geometry2d/blueprint-sketcher.js.map +1 -0
- package/dist/geometry2d/blueprint.d.ts +102 -0
- package/dist/geometry2d/blueprint.d.ts.map +1 -0
- package/dist/geometry2d/blueprint.js +225 -0
- package/dist/geometry2d/blueprint.js.map +1 -0
- package/dist/geometry2d/blueprints.d.ts +58 -0
- package/dist/geometry2d/blueprints.d.ts.map +1 -0
- package/dist/geometry2d/blueprints.js +72 -0
- package/dist/geometry2d/blueprints.js.map +1 -0
- package/dist/geometry2d/bridge/lift-on-plane.d.ts +50 -0
- package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -0
- package/dist/geometry2d/bridge/lift-on-plane.js +78 -0
- package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -0
- package/dist/geometry2d/bridge/on-surface.d.ts +98 -0
- package/dist/geometry2d/bridge/on-surface.d.ts.map +1 -0
- package/dist/geometry2d/bridge/on-surface.js +94 -0
- package/dist/geometry2d/bridge/on-surface.js.map +1 -0
- package/dist/geometry2d/bridge/plane.d.ts +69 -0
- package/dist/geometry2d/bridge/plane.d.ts.map +1 -0
- package/dist/geometry2d/bridge/plane.js +96 -0
- package/dist/geometry2d/bridge/plane.js.map +1 -0
- package/dist/geometry2d/canned-blueprints.d.ts +44 -0
- package/dist/geometry2d/canned-blueprints.d.ts.map +1 -0
- package/dist/geometry2d/canned-blueprints.js +94 -0
- package/dist/geometry2d/canned-blueprints.js.map +1 -0
- package/dist/geometry2d/compound-blueprint.d.ts +72 -0
- package/dist/geometry2d/compound-blueprint.d.ts.map +1 -0
- package/dist/geometry2d/compound-blueprint.js +95 -0
- package/dist/geometry2d/compound-blueprint.js.map +1 -0
- package/dist/geometry2d/curve2d.d.ts +298 -0
- package/dist/geometry2d/curve2d.d.ts.map +1 -0
- package/dist/geometry2d/curve2d.js +1110 -0
- package/dist/geometry2d/curve2d.js.map +1 -0
- package/dist/geometry2d/index.d.ts +22 -0
- package/dist/geometry2d/index.d.ts.map +1 -0
- package/dist/geometry2d/index.js +21 -0
- package/dist/geometry2d/index.js.map +1 -0
- package/dist/geometry2d/organise.d.ts +28 -0
- package/dist/geometry2d/organise.d.ts.map +1 -0
- package/dist/geometry2d/organise.js +108 -0
- package/dist/geometry2d/organise.js.map +1 -0
- package/dist/geometry2d/pen-sketcher.d.ts +365 -0
- package/dist/geometry2d/pen-sketcher.d.ts.map +1 -0
- package/dist/geometry2d/pen-sketcher.js +520 -0
- package/dist/geometry2d/pen-sketcher.js.map +1 -0
- package/dist/geometry2d/point.d.ts +44 -0
- package/dist/geometry2d/point.d.ts.map +1 -0
- package/dist/geometry2d/point.js +57 -0
- package/dist/geometry2d/point.js.map +1 -0
- package/dist/geometry2d/svg-ellipse.d.ts +74 -0
- package/dist/geometry2d/svg-ellipse.d.ts.map +1 -0
- package/dist/geometry2d/svg-ellipse.js +163 -0
- package/dist/geometry2d/svg-ellipse.js.map +1 -0
- package/dist/lang/code-to-args.d.ts +29 -3
- package/dist/lang/code-to-args.d.ts.map +1 -1
- package/dist/lang/code-to-args.js +41 -2
- package/dist/lang/code-to-args.js.map +1 -1
- package/dist/lang/codegen.d.ts +45 -1
- package/dist/lang/codegen.d.ts.map +1 -1
- package/dist/lang/codegen.js +135 -6
- package/dist/lang/codegen.js.map +1 -1
- package/dist/lang/host-arg.d.ts +6 -0
- package/dist/lang/host-arg.d.ts.map +1 -1
- package/dist/lang/host-arg.js.map +1 -1
- package/dist/lang/metadata-extractor.d.ts +25 -0
- package/dist/lang/metadata-extractor.d.ts.map +1 -1
- package/dist/lang/metadata-extractor.js +289 -25
- package/dist/lang/metadata-extractor.js.map +1 -1
- package/dist/lang/parse-error.d.ts +7 -1
- package/dist/lang/parse-error.d.ts.map +1 -1
- package/dist/lang/parse-error.js.map +1 -1
- package/dist/lang/security-scanner.d.ts +9 -1
- package/dist/lang/security-scanner.d.ts.map +1 -1
- package/dist/lang/security-scanner.js +38 -1
- package/dist/lang/security-scanner.js.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +3 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +3 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/mesh/io.d.ts +62 -9
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +124 -17
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/threemf-loader.d.ts +15 -0
- package/dist/mesh/threemf-loader.d.ts.map +1 -0
- package/dist/mesh/threemf-loader.js +163 -0
- package/dist/mesh/threemf-loader.js.map +1 -0
- package/dist/mesh/transform.d.ts +2 -2
- package/dist/mesh/transform.d.ts.map +1 -1
- package/dist/mesh/transform.js +3 -3
- package/dist/mesh/transform.js.map +1 -1
- package/dist/mesh/types.d.ts +2 -2
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +53 -26
- package/dist/node-host/cli.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +4 -2
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/occt-kernel/topologyExt.d.ts.map +1 -1
- package/dist/occt-kernel/topologyExt.js +4 -1
- package/dist/occt-kernel/topologyExt.js.map +1 -1
- package/dist/runtime-state.d.ts +18 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +23 -0
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdk.d.ts +1 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +1 -1
- package/dist/sdk.js.map +1 -1
- package/dist/tolerance.d.ts +38 -0
- package/dist/tolerance.d.ts.map +1 -0
- package/dist/tolerance.js +40 -0
- package/dist/tolerance.js.map +1 -0
- package/dist/topology/naming/score.js +3 -3
- package/dist/topology/naming/score.js.map +1 -1
- package/dist/units.d.ts +248 -0
- package/dist/units.d.ts.map +1 -0
- package/dist/units.js +397 -0
- package/dist/units.js.map +1 -0
- 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":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAE9E,oEAAoE;AACpE,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,4DAA4D;AAC5D,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,SAAS,CAAA;IACf,EAAE,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,CAAA;IACtC,MAAM,EAAE,QAAQ,EAAE,CAAA;CACnB;AAED,kDAAkD;AAClD,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,YAAY,CAAA;IAClB,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,EAAE,WAAW,CAAA;CACnB;AAED,qDAAqD;AACrD,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,eAAe,CAAA;IACrB,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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":"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","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":"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","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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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":"AAAA;;;;;;;;GAQG;AAOH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAO5D;;;;;;;;;GASG;AACH,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAQ;IACd,MAAM,GAAG,CAAC,CAAA;IACV,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAA;IACpC,WAAW,CAAe;IAElC;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;QACzF,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,EAAmC,EAAE,EAAE;YAC9D,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QAC7B,CAAC,CAAA;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC,CAAA;YAC9D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC,CAAA;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAC;aACjF,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAC1B,CAAC;IAEO,aAAa,CAAC,GAAsB;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACxC,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC3B,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,GAAU;QAC1B,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC3D,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;IAEO,IAAI,CAAC,GAAqB;QAChC,OAAO,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAA6B,EAAE,MAAM,EAAE,CAAC,CAAA;YAC5E,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,KAAK,CAAC,IAAI,CAChB,OAAyC;QAEzC,MAAM,IAAI,CAAC,WAAW,CAAA;QACtB,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAM,CAAA;QAC1D,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAsC,EAAE,MAAkB;QACtE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CACzB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAC9C,CAAA;QACD,OAAO,GAAG,CAAC,MAAM,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,UAAU,CACd,IAAc,EACd,KAAkB;QAElB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CACzB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAClD,CAAA;QACD,OAAO,GAAG,CAAC,MAAM,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,IAAc,EACd,MAOC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAGzB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CACtD,CAAA;QACD,OAAO,GAAG,CAAC,MAAM,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,UAAU,CACd,IAAc,EACd,MAOC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAGzB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CACnD,CAAA;QACD,OAAO,GAAG,CAAC,MAAM,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,IAAc,EACd,MAOC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAGzB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAC3D,CAAA;QACD,OAAO,GAAG,CAAC,MAAM,CAAA;IACnB,CAAC;IAED,8CAA8C;IAC9C,SAAS;QACP,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAA;QAC3C,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAA;IACzB,CAAC;CACF","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
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,OAAO,
|
|
1
|
+
{"version":3,"file":"direct-executor.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/direct-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -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);
|