@tscircuit/rectdiff 0.0.28 → 0.0.30

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 (68) hide show
  1. package/.github/workflows/bun-pver-release.yml +24 -45
  2. package/lib/RectDiffPipeline.ts +0 -46
  3. package/lib/fixtures/twoNodeExpansionFixture.ts +1 -1
  4. package/lib/solvers/GapFillSolver/ExpandEdgesToEmptySpaceSolver.ts +4 -2
  5. package/lib/solvers/GapFillSolver/FindSegmentsWithAdjacentEmptySpaceSolver.ts +3 -1
  6. package/lib/solvers/GapFillSolver/GapFillSolverPipeline.ts +6 -2
  7. package/lib/solvers/RectDiffExpansionSolver/RectDiffExpansionSolver.ts +5 -2
  8. package/lib/solvers/RectDiffGridSolverPipeline/RectDiffGridSolverPipeline.ts +8 -5
  9. package/lib/solvers/RectDiffGridSolverPipeline/buildObstacleIndexes.ts +6 -6
  10. package/lib/solvers/RectDiffSeedingSolver/RectDiffSeedingSolver.ts +4 -4
  11. package/lib/solvers/RectDiffSeedingSolver/computeCandidates3D.ts +1 -1
  12. package/lib/solvers/RectDiffSeedingSolver/computeEdgeCandidates3D.ts +1 -1
  13. package/lib/solvers/RectDiffSeedingSolver/longestFreeSpanAroundZ.ts +1 -1
  14. package/lib/types/capacity-mesh-types.ts +1 -1
  15. package/lib/types/srj-types.ts +0 -1
  16. package/lib/utils/expandRectFromSeed.ts +1 -1
  17. package/lib/utils/finalizeRects.ts +1 -1
  18. package/lib/utils/isFullyOccupiedAtPoint.ts +1 -1
  19. package/lib/utils/isSelfRect.ts +1 -1
  20. package/lib/utils/rectToTree.ts +2 -2
  21. package/lib/utils/renderObstacleClearance.ts +1 -1
  22. package/lib/utils/resizeSoftOverlaps.ts +1 -1
  23. package/lib/utils/sameTreeRect.ts +1 -1
  24. package/lib/utils/searchStrip.ts +1 -1
  25. package/package.json +12 -8
  26. package/pages/repro/merge-single-layer-node.page.tsx +17 -0
  27. package/tests/__snapshots__/board-outline.snap.svg +2 -2
  28. package/tests/solver/__snapshots__/rectDiffGridSolverPipeline.snap.svg +1 -1
  29. package/tests/solver/both-points-equivalent/__snapshots__/both-points-equivalent.snap.svg +1 -1
  30. package/tests/solver/bugreport01-be84eb/__snapshots__/bugreport01-be84eb.snap.svg +1 -1
  31. package/tests/solver/bugreport02-bc4361/__snapshots__/bugreport02-bc4361.snap.svg +1 -1
  32. package/tests/solver/bugreport03-fe4a17/__snapshots__/bugreport03-fe4a17.snap.svg +1 -1
  33. package/tests/solver/bugreport07-d3f3be/__snapshots__/bugreport07-d3f3be.snap.svg +1 -1
  34. package/tests/solver/bugreport08-e3ec95/__snapshots__/bugreport08-e3ec95.snap.svg +1 -1
  35. package/tests/solver/bugreport09-618e09/__snapshots__/bugreport09-618e09.snap.svg +1 -1
  36. package/tests/solver/bugreport10-71239a/__snapshots__/bugreport10-71239a.snap.svg +1 -1
  37. package/tests/solver/bugreport11-b2de3c/__snapshots__/bugreport11-b2de3c.snap.svg +1 -1
  38. package/tests/solver/bugreport12-35ce1c/__snapshots__/bugreport12-35ce1c.snap.svg +1 -1
  39. package/tests/solver/bugreport13-b9a758/__snapshots__/bugreport13-b9a758.snap.svg +1 -1
  40. package/tests/solver/bugreport16-d95f38/__snapshots__/bugreport16-d95f38.snap.svg +1 -1
  41. package/tests/solver/bugreport19/__snapshots__/bugreport19.snap.svg +1 -1
  42. package/tests/solver/bugreport20-obstacle-clipping/__snapshots__/bugreport20-obstacle-clipping.snap.svg +1 -1
  43. package/tests/solver/bugreport21-board-outline/__snapshots__/bugreport21-board-outline.snap.svg +2 -2
  44. package/tests/solver/bugreport22-2a75ce/__snapshots__/bugreport22-2a75ce.snap.svg +1 -1
  45. package/tests/solver/bugreport23-LGA15x4/__snapshots__/bugreport23-LGA15x4.snap.svg +1 -1
  46. package/tests/solver/bugreport24-05597c/__snapshots__/bugreport24-05597c.snap.svg +1 -1
  47. package/tests/solver/bugreport25-4b1d55/__snapshots__/bugreport25-4b1d55.snap.svg +1 -1
  48. package/tests/solver/bugreport36-bf8303/__snapshots__/bugreport36-bf8303.snap.svg +1 -1
  49. package/tests/solver/interaction/__snapshots__/interaction.snap.svg +1 -1
  50. package/tests/solver/multi-point/__snapshots__/multi-point.snap.svg +1 -1
  51. package/tests/solver/no-better-path/__snapshots__/no-better-path.snap.svg +1 -1
  52. package/tests/solver/repros/merge-single-layer-node/merge-single-layer-node.json +861 -0
  53. package/tests/solver/{bugreport50-multi-support-layer-merge/bugreport50-multi-support-layer-merge.test.ts → repros/merge-single-layer-node/merge-single-layer-node.test.ts} +7 -42
  54. package/tests/solver/transitivity/__snapshots__/transitivity.snap.svg +2 -2
  55. package/tsconfig.json +5 -1
  56. package/vite.config.ts +4 -0
  57. package/dist/index.d.ts +0 -427
  58. package/dist/index.js +0 -3319
  59. package/lib/solvers/AdjacentLayerContainmentMergeSolver/AdjacentLayerContainmentMergeSolver.ts +0 -456
  60. package/lib/solvers/OuterLayerContainmentMergeSolver/OuterLayerContainmentMergeSolver.ts +0 -314
  61. package/pages/bugreports/bugreport50-multi-support-layer-merge.page.tsx +0 -19
  62. package/pages/pour.page.tsx +0 -18
  63. package/test-assets/bugreport49-634662.json +0 -412
  64. package/tests/outer-layer-containment-merge-solver.test.ts +0 -73
  65. package/tests/solver/bugreport49-634662/__snapshots__/bugreport49-634662.snap.svg +0 -44
  66. package/tests/solver/bugreport49-634662/bugreport49-634662.test.ts +0 -130
  67. package/tests/solver/bugreport50-multi-support-layer-merge/__snapshots__/bugreport50-multi-support-layer-merge.snap.svg +0 -44
  68. package/tests/solver/bugreport50-multi-support-layer-merge/bugreport50-multi-support-layer-merge.json +0 -972
@@ -1,5 +1,5 @@
1
1
  import { expect, test } from "bun:test"
2
- import srj_json from "./bugreport50-multi-support-layer-merge.json"
2
+ import inputProblems from "./merge-single-layer-node.json"
3
3
  import {
4
4
  getBounds,
5
5
  getSvgFromGraphicsObject,
@@ -12,46 +12,10 @@ import { RectDiffPipeline } from "lib/RectDiffPipeline"
12
12
  import { makeCapacityMeshNodeWithLayerInfo } from "tests/fixtures/makeCapacityMeshNodeWithLayerInfo"
13
13
  import { makeSimpleRouteOutlineGraphics } from "tests/fixtures/makeSimpleRouteOutlineGraphics"
14
14
 
15
- const wrapped = Array.isArray(srj_json) ? srj_json[0] : srj_json
16
- const srj = wrapped.simple_route_json ?? wrapped.simpleRouteJson ?? wrapped
17
-
18
- const getFreeNodeCounts = (
19
- meshNodes: ReturnType<RectDiffPipeline["getOutput"]>["meshNodes"],
20
- ) => {
21
- const counts = new Map<string, number>()
22
-
23
- for (const node of meshNodes) {
24
- if (node._containsObstacle || node._containsTarget) continue
25
-
26
- const key = node.availableZ.join(",")
27
- counts.set(key, (counts.get(key) ?? 0) + 1)
28
- }
29
-
30
- return counts
31
- }
32
-
33
- test("bugreport50-multi-support-layer-merge promotes adjacent-layer nodes supported by multiple peers", () => {
34
- const solver = new RectDiffPipeline({
35
- simpleRouteJson: srj,
36
- })
37
-
38
- solver.solve()
39
-
40
- const counts = getFreeNodeCounts(solver.getOutput().meshNodes)
41
- const z0 = counts.get("0") ?? 0
42
- const z01 = counts.get("0,1") ?? 0
43
-
44
- expect(z01).toBeGreaterThan(40)
45
- expect(z01).toBeGreaterThan(z0)
46
- expect(z0).toBeLessThan(10)
47
- })
48
-
49
- test("bugreport50-multi-support-layer-merge", async () => {
50
- const solver = new RectDiffPipeline({
51
- simpleRouteJson: srj,
52
- })
53
-
54
- const outline = makeSimpleRouteOutlineGraphics(srj)
15
+ test("node-solver input repro snapshot", async () => {
16
+ const problem = inputProblems[0]!
17
+ const solver = new RectDiffPipeline(problem)
18
+ const outline = makeSimpleRouteOutlineGraphics(problem.simpleRouteJson)
55
19
 
56
20
  solver.solve()
57
21
 
@@ -59,7 +23,7 @@ test("bugreport50-multi-support-layer-merge", async () => {
59
23
  const rectsByCombo = makeCapacityMeshNodeWithLayerInfo(meshNodes)
60
24
  const allGraphicsObjects: GraphicsObject[] = []
61
25
 
62
- for (const z of Array.from({ length: srj.layerCount }, (_, index) => index)) {
26
+ for (let z = 0; z < problem.simpleRouteJson.layerCount; z++) {
63
27
  const layerRects: Rect[] = []
64
28
 
65
29
  for (const [key, rects] of rectsByCombo) {
@@ -121,5 +85,6 @@ test("bugreport50-multi-support-layer-merge", async () => {
121
85
  svgWidth,
122
86
  svgHeight,
123
87
  })
88
+
124
89
  await expect(svg).toMatchSvgSnapshot(import.meta.path)
125
90
  })
@@ -1,4 +1,4 @@
1
- <svg width="640" height="1652" viewBox="0 0 640 1652" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="white"/><g><polyline data-points="-5,-5 25,-5 25,25 -5,25 -5,-5" data-type="line" data-label="bounds" points="39.99999999999997,745.6944444444446 600,745.6944444444446 600,185.6944444444445 39.99999999999997,185.6944444444445 39.99999999999997,745.6944444444446" fill="none" stroke="#111827" stroke-width="1.866666666666667"/></g><g><polyline data-points="-5,-48.02083333333333 25,-48.02083333333333 25,-18.02083333333333 -5,-18.02083333333333 -5,-48.02083333333333" data-type="line" data-label="bounds" points="39.99999999999997,1548.75 600,1548.75 600,988.75 39.99999999999997,988.75 39.99999999999997,1548.75" fill="none" stroke="#111827" stroke-width="1.866666666666667"/></g><g><rect data-type="rect" data-label="node" data-x="2.25" data-y="13.25" x="39.99999999999997" y="185.6944444444445" width="270.66666666666663" height="438.6666666666667" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="17.25" data-y="2.25" x="310.66666666666663" y="475.0277777777778" width="289.33333333333337" height="270.66666666666674" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="14.5" data-y="17.75" x="310.66666666666663" y="185.6944444444445" width="186.66666666666669" height="270.6666666666667" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="14.924999999999997" data-y="10" x="376.9333333333333" y="456.3611111111112" width="70" height="18.66666666666663" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="18.5375" data-y="10" x="446.9333333333334" y="456.3611111111112" width="64.86666666666656" height="18.66666666666663" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="2.75" data-y="-2.75" x="58.66666666666664" y="661.6944444444446" width="252" height="84" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="22.75" data-y="18.0375" x="516" y="185.6944444444445" width="84" height="259.93333333333334" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="-2.75" data-y="0.5" x="39.99999999999997" y="624.3611111111112" width="84.00000000000001" height="37.33333333333337" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="5.275" data-y="0.5" x="175.79999999999998" y="624.3611111111112" width="112.00000000000003" height="37.33333333333337" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="11.775" data-y="10" x="329.3333333333333" y="456.3611111111112" width="47.60000000000002" height="18.66666666666663" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="22.6375" data-y="10.2875" x="511.79999999999995" y="445.62777777777785" width="88.20000000000005" height="29.399999999999977" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="8.8875" data-y="0.5" x="287.79999999999995" y="624.3611111111112" width="22.866666666666674" height="37.33333333333337" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="1" x="123.99999999999999" y="624.3611111111112" width="18.66666666666667" height="18.66666666666663" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="1.3875" data-y="0" x="142.66666666666666" y="643.0277777777778" width="33.133333333333326" height="18.666666666666742" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="15.2875" x="497.3333333333333" y="288.3611111111112" width="18.666666666666686" height="157.26666666666665" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="22.75" x="497.3333333333333" y="185.6944444444445" width="18.666666666666686" height="84" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="-4.5" data-y="-2.68125" x="39.99999999999997" y="661.6944444444446" width="18.66666666666667" height="81.43333333333328" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="1.8875" data-y="1" x="161.33333333333331" y="624.3611111111112" width="14.466666666666669" height="18.66666666666663" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="19.8875" data-y="10.7875" x="497.3333333333333" y="445.62777777777785" width="14.46666666666664" height="10.733333333333348" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="0" x="123.99999999999999" y="643.0277777777778" width="18.66666666666667" height="18.666666666666742" fill="red" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="10" data-y="10" x="310.66666666666663" y="456.3611111111112" width="18.666666666666686" height="18.66666666666663" fill="red" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="20" x="497.3333333333333" y="269.6944444444445" width="18.666666666666686" height="18.666666666666686" fill="red" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="1" data-y="1" x="142.66666666666666" y="624.3611111111112" width="18.666666666666657" height="18.66666666666663" fill="red" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="2.25" data-y="-29.77083333333333" x="39.99999999999997" y="988.75" width="270.66666666666663" height="438.66666666666674" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="17.25" data-y="-40.77083333333333" x="310.66666666666663" y="1278.0833333333335" width="289.33333333333337" height="270.6666666666665" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="14.5" data-y="-25.27083333333333" x="310.66666666666663" y="988.75" width="186.66666666666669" height="270.66666666666674" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="14.924999999999997" data-y="-33.02083333333333" x="376.9333333333333" y="1259.4166666666667" width="70" height="18.666666666666742" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="18.5375" data-y="-33.02083333333333" x="446.9333333333334" y="1259.4166666666667" width="64.86666666666656" height="18.666666666666742" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="2.75" data-y="-45.77083333333333" x="58.66666666666664" y="1464.75" width="252" height="84" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="22.75" data-y="-24.983333333333327" x="516" y="988.75" width="84" height="259.9333333333334" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="-2.75" data-y="-42.52083333333333" x="39.99999999999997" y="1427.4166666666667" width="84.00000000000001" height="37.33333333333326" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="5.275" data-y="-42.52083333333333" x="175.79999999999998" y="1427.4166666666667" width="112.00000000000003" height="37.33333333333326" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="11.775" data-y="-33.02083333333333" x="329.3333333333333" y="1259.4166666666667" width="47.60000000000002" height="18.666666666666742" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="22.6375" data-y="-32.73333333333333" x="511.79999999999995" y="1248.6833333333334" width="88.20000000000005" height="29.40000000000009" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="8.8875" data-y="-42.52083333333333" x="287.79999999999995" y="1427.4166666666667" width="22.866666666666674" height="37.33333333333326" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="-42.02083333333333" x="123.99999999999999" y="1427.4166666666667" width="18.66666666666667" height="18.666666666666742" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="1.3875" data-y="-43.02083333333333" x="142.66666666666666" y="1446.0833333333335" width="33.133333333333326" height="18.666666666666515" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="-27.733333333333327" x="497.3333333333333" y="1091.4166666666667" width="18.666666666666686" height="157.26666666666665" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="-20.27083333333333" x="497.3333333333333" y="988.75" width="18.666666666666686" height="84" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="-4.5" data-y="-45.70208333333333" x="39.99999999999997" y="1464.75" width="18.66666666666667" height="81.4333333333334" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="1.8875" data-y="-42.02083333333333" x="161.33333333333331" y="1427.4166666666667" width="14.466666666666669" height="18.666666666666742" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="19.8875" data-y="-32.23333333333333" x="497.3333333333333" y="1248.6833333333334" width="14.46666666666664" height="10.733333333333348" fill="#dbeafe" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="10" data-y="-33.02083333333333" x="310.66666666666663" y="1259.4166666666667" width="18.666666666666686" height="18.666666666666742" fill="#fef3c7" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="-43.02083333333333" x="123.99999999999999" y="1446.0833333333335" width="18.66666666666667" height="18.666666666666515" fill="#fef3c7" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="1" data-y="-42.02083333333333" x="142.66666666666666" y="1427.4166666666667" width="18.666666666666657" height="18.666666666666742" fill="#fef3c7" stroke="black" stroke-width="0.05357142857142857"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="-23.02083333333333" x="497.3333333333333" y="1072.75" width="18.666666666666686" height="18.666666666666742" fill="#fef3c7" stroke="black" stroke-width="0.05357142857142857"/></g><text data-type="text" data-label="Layer z=0" data-x="0" data-y="28.916666666666664" x="133.33333333333331" y="112.58333333333348" fill="black" font-size="9.333333333333334" font-family="sans-serif" text-anchor="end" dominant-baseline="text-before-edge">Layer z=0</text><text data-type="text" data-label="Layer z=1" data-x="0" data-y="-14.104166666666664" x="133.33333333333331" y="915.6388888888889" fill="black" font-size="9.333333333333334" font-family="sans-serif" text-anchor="end" dominant-baseline="text-before-edge">Layer z=1</text><g id="crosshair" style="display: none"><line id="crosshair-h" y1="0" y2="1652" stroke="#666" stroke-width="0.5"/><line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5"/><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text></g><script><![CDATA[
1
+ <svg width="640" height="1652" viewBox="0 0 640 1652" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="white"/><g><polyline data-points="-5,-5 25,-5 25,25 -5,25 -5,-5" data-type="line" data-label="bounds" points="40,745.6944444444446 600,745.6944444444446 600,185.69444444444457 40,185.69444444444457 40,745.6944444444446" fill="none" stroke="#111827" stroke-width="1.8666666666666665"/></g><g><polyline data-points="-5,-48.02083333333333 25,-48.02083333333333 25,-18.02083333333333 -5,-18.02083333333333 -5,-48.02083333333333" data-type="line" data-label="bounds" points="40,1548.75 600,1548.75 600,988.75 40,988.75 40,1548.75" fill="none" stroke="#111827" stroke-width="1.8666666666666665"/></g><g><rect data-type="rect" data-label="node" data-x="2.25" data-y="13.25" x="40" y="185.69444444444457" width="270.66666666666663" height="438.66666666666663" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="17.25" data-y="2.25" x="310.66666666666663" y="475.0277777777779" width="289.33333333333337" height="270.6666666666667" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="14.5" data-y="17.75" x="310.66666666666663" y="185.69444444444457" width="186.66666666666663" height="270.66666666666663" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="14.925" data-y="10" x="376.9333333333333" y="456.3611111111112" width="70" height="18.666666666666686" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="18.5375" data-y="10" x="446.9333333333333" y="456.3611111111112" width="64.86666666666667" height="18.666666666666686" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="2.7500000000000004" data-y="-2.75" x="58.66666666666667" y="661.6944444444446" width="251.99999999999994" height="84" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="22.75" data-y="18.0375" x="516" y="185.69444444444457" width="84" height="259.9333333333333" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="-2.75" data-y="0.5" x="40" y="624.3611111111112" width="83.99999999999999" height="37.33333333333337" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="5.275" data-y="0.5" x="175.79999999999998" y="624.3611111111112" width="111.99999999999997" height="37.33333333333337" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="11.774999999999999" data-y="10" x="329.33333333333326" y="456.3611111111112" width="47.599999999999966" height="18.666666666666686" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="22.637500000000003" data-y="10.2875" x="511.79999999999995" y="445.6277777777779" width="88.20000000000005" height="29.399999999999977" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="8.8875" data-y="0.5" x="287.79999999999995" y="624.3611111111112" width="22.866666666666674" height="37.33333333333337" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="1" x="123.99999999999999" y="624.3611111111112" width="18.66666666666667" height="18.66666666666663" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="1.3875000000000002" data-y="0" x="142.66666666666666" y="643.0277777777778" width="33.133333333333326" height="18.666666666666742" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="15.2875" x="497.33333333333326" y="288.36111111111126" width="18.666666666666742" height="157.26666666666665" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="22.75" x="497.33333333333326" y="185.69444444444457" width="18.666666666666742" height="84" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="-4.5" data-y="-2.68125" x="40" y="661.6944444444446" width="18.66666666666667" height="81.43333333333328" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="1.8875000000000002" data-y="1" x="161.33333333333331" y="624.3611111111112" width="14.466666666666669" height="18.66666666666663" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="19.887500000000003" data-y="10.7875" x="497.33333333333326" y="445.6277777777779" width="14.466666666666754" height="10.733333333333292" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="0" x="123.99999999999999" y="643.0277777777778" width="18.66666666666667" height="18.666666666666742" fill="red" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="10" data-y="10" x="310.66666666666663" y="456.3611111111112" width="18.66666666666663" height="18.666666666666686" fill="red" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="20" x="497.33333333333326" y="269.69444444444457" width="18.666666666666742" height="18.666666666666686" fill="red" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="1" data-y="1" x="142.66666666666666" y="624.3611111111112" width="18.666666666666657" height="18.66666666666663" fill="red" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="2.25" data-y="-29.77083333333333" x="40" y="988.75" width="270.66666666666663" height="438.6666666666665" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="17.25" data-y="-40.77083333333333" x="310.66666666666663" y="1278.0833333333333" width="289.33333333333337" height="270.66666666666674" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="14.5" data-y="-25.27083333333333" x="310.66666666666663" y="988.75" width="186.66666666666663" height="270.6666666666665" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="14.925" data-y="-33.02083333333333" x="376.9333333333333" y="1259.4166666666665" width="70" height="18.666666666666742" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="18.5375" data-y="-33.02083333333333" x="446.9333333333333" y="1259.4166666666665" width="64.86666666666667" height="18.666666666666742" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="2.7500000000000004" data-y="-45.77083333333333" x="58.66666666666667" y="1464.75" width="251.99999999999994" height="84" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="22.75" data-y="-24.983333333333327" x="516" y="988.75" width="84" height="259.93333333333317" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="-2.75" data-y="-42.52083333333333" x="40" y="1427.4166666666665" width="83.99999999999999" height="37.333333333333485" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="5.275" data-y="-42.52083333333333" x="175.79999999999998" y="1427.4166666666665" width="111.99999999999997" height="37.333333333333485" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="11.774999999999999" data-y="-33.02083333333333" x="329.33333333333326" y="1259.4166666666665" width="47.599999999999966" height="18.666666666666742" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="22.637500000000003" data-y="-32.73333333333333" x="511.79999999999995" y="1248.6833333333332" width="88.20000000000005" height="29.40000000000009" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="8.8875" data-y="-42.52083333333333" x="287.79999999999995" y="1427.4166666666665" width="22.866666666666674" height="37.333333333333485" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="-42.02083333333333" x="123.99999999999999" y="1427.4166666666665" width="18.66666666666667" height="18.666666666666742" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="1.3875000000000002" data-y="-43.02083333333333" x="142.66666666666666" y="1446.0833333333333" width="33.133333333333326" height="18.666666666666742" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="-27.733333333333327" x="497.33333333333326" y="1091.4166666666665" width="18.666666666666742" height="157.26666666666665" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="-20.27083333333333" x="497.33333333333326" y="988.75" width="18.666666666666742" height="84" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="-4.5" data-y="-45.70208333333333" x="40" y="1464.75" width="18.66666666666667" height="81.43333333333317" fill="#dbeafe" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="10" data-y="-33.02083333333333" x="310.66666666666663" y="1259.4166666666665" width="18.66666666666663" height="18.666666666666742" fill="#fef3c7" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="-43.02083333333333" x="123.99999999999999" y="1446.0833333333333" width="18.66666666666667" height="18.666666666666742" fill="#fef3c7" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="1.3875000000000002" data-y="-42.02083333333333" x="142.66666666666666" y="1427.4166666666665" width="33.133333333333326" height="18.666666666666742" fill="#fef3c7" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="19.887500000000003" data-y="-32.23333333333333" x="497.33333333333326" y="1248.6833333333332" width="14.466666666666754" height="10.733333333333348" fill="#fef3c7" stroke="black" stroke-width="0.053571428571428575"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="-23.02083333333333" x="497.33333333333326" y="1072.75" width="18.666666666666742" height="18.666666666666515" fill="#fef3c7" stroke="black" stroke-width="0.053571428571428575"/></g><text data-type="text" data-label="Layer z=0" data-x="0" data-y="28.916666666666664" x="133.33333333333331" y="112.58333333333348" fill="black" font-size="9.333333333333332" font-family="sans-serif" text-anchor="end" dominant-baseline="text-before-edge">Layer z=0</text><text data-type="text" data-label="Layer z=1" data-x="0" data-y="-14.104166666666664" x="133.33333333333331" y="915.6388888888889" fill="black" font-size="9.333333333333332" font-family="sans-serif" text-anchor="end" dominant-baseline="text-before-edge">Layer z=1</text><g id="crosshair" style="display: none"><line id="crosshair-h" y1="0" y2="1652" stroke="#666" stroke-width="0.5"/><line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5"/><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text></g><script><![CDATA[
2
2
  document.currentScript.parentElement.addEventListener('mousemove', (e) => {
3
3
  const svg = e.currentTarget;
4
4
  const rect = svg.getBoundingClientRect();
@@ -20,7 +20,7 @@
20
20
  v.setAttribute('y2', '1652');
21
21
 
22
22
  // Calculate real coordinates using inverse transformation
23
- const matrix = {"a":18.666666666666668,"c":0,"e":133.33333333333331,"b":0,"d":-18.666666666666668,"f":652.3611111111112};
23
+ const matrix = {"a":18.666666666666664,"c":0,"e":133.33333333333331,"b":0,"d":-18.666666666666664,"f":652.3611111111112};
24
24
  // Manually invert and apply the affine transform
25
25
  // Since we only use translate and scale, we can directly compute:
26
26
  // x' = (x - tx) / sx
package/tsconfig.json CHANGED
@@ -8,7 +8,11 @@
8
8
  "jsx": "react-jsx",
9
9
  "allowJs": true,
10
10
  "paths": {
11
- "lib/*": ["./lib/*"]
11
+ "lib/*": ["./lib/*"],
12
+ "components/*": ["./components/*"],
13
+ "tests/*": ["./tests/*"],
14
+ "pages/*": ["./pages/*"],
15
+ "utils/*": ["./utils/*"]
12
16
  },
13
17
  "baseUrl": ".",
14
18
 
package/vite.config.ts CHANGED
@@ -8,6 +8,10 @@ export default defineConfig({
8
8
  resolve: {
9
9
  alias: {
10
10
  lib: path.resolve(__dirname, "lib"),
11
+ components: path.resolve(__dirname, "components"),
12
+ tests: path.resolve(__dirname, "tests"),
13
+ pages: path.resolve(__dirname, "pages"),
14
+ utils: path.resolve(__dirname, "utils"),
11
15
  },
12
16
  },
13
17
  })
package/dist/index.d.ts DELETED
@@ -1,427 +0,0 @@
1
- import { BaseSolver, BasePipelineSolver, PipelineStep } from '@tscircuit/solver-utils';
2
- import { GraphicsObject } from 'graphics-debug';
3
- import Flatbush from 'flatbush';
4
- import RBush from 'rbush';
5
- import { Bounds } from '@tscircuit/math-utils';
6
-
7
- type TraceId = string;
8
- interface SimpleRouteJson {
9
- layerCount: number;
10
- minTraceWidth: number;
11
- minViaDiameter?: number;
12
- obstacles: Obstacle[];
13
- connections: Array<SimpleRouteConnection>;
14
- bounds: {
15
- minX: number;
16
- maxX: number;
17
- minY: number;
18
- maxY: number;
19
- };
20
- outline?: Array<{
21
- x: number;
22
- y: number;
23
- }>;
24
- }
25
- interface Obstacle {
26
- type: "rect";
27
- layers: string[];
28
- zLayers?: number[];
29
- center: {
30
- x: number;
31
- y: number;
32
- };
33
- width: number;
34
- height: number;
35
- connectedTo: TraceId[];
36
- netIsAssignable?: boolean;
37
- isCopperPour?: boolean;
38
- offBoardConnectsTo?: TraceId[];
39
- }
40
- interface SimpleRouteConnection {
41
- name: string;
42
- netConnectionName?: string;
43
- nominalTraceWidth?: number;
44
- pointsToConnect: Array<{
45
- x: number;
46
- y: number;
47
- layer: string;
48
- pointId?: string;
49
- pcb_port_id?: string;
50
- }>;
51
- externallyConnectedPointIds?: string[][];
52
- }
53
-
54
- type XYRect = {
55
- x: number;
56
- y: number;
57
- width: number;
58
- height: number;
59
- };
60
- type GridFill3DOptions = {
61
- gridSizes?: number[];
62
- initialCellRatio?: number;
63
- maxAspectRatio?: number | null;
64
- minSingle: {
65
- width: number;
66
- height: number;
67
- };
68
- minMulti: {
69
- width: number;
70
- height: number;
71
- minLayers: number;
72
- };
73
- preferMultiLayer?: boolean;
74
- maxMultiLayerSpan?: number;
75
- };
76
- type Candidate3D = {
77
- x: number;
78
- y: number;
79
- z: number;
80
- distance: number;
81
- /** Larger values mean more multi-layer potential at this seed. */
82
- zSpanLen?: number;
83
- /** Marked when the seed came from the edge analysis pass. */
84
- isEdgeSeed?: boolean;
85
- };
86
- type Placed3D = {
87
- rect: XYRect;
88
- zLayers: number[];
89
- };
90
-
91
- type CapacityMeshNodeId = string;
92
- interface CapacityMeshNode {
93
- capacityMeshNodeId: string;
94
- center: {
95
- x: number;
96
- y: number;
97
- };
98
- width: number;
99
- height: number;
100
- layer: string;
101
- availableZ: number[];
102
- _depth?: number;
103
- _completelyInsideObstacle?: boolean;
104
- _containsObstacle?: boolean;
105
- _containsTarget?: boolean;
106
- _targetConnectionName?: string;
107
- _strawNode?: boolean;
108
- _strawParentCapacityMeshNodeId?: CapacityMeshNodeId;
109
- _adjacentNodeIds?: CapacityMeshNodeId[];
110
- _parent?: CapacityMeshNode;
111
- }
112
- type RTreeRect = XYRect & {
113
- minX: number;
114
- minY: number;
115
- maxX: number;
116
- maxY: number;
117
- zLayers: number[];
118
- };
119
-
120
- type AdjacentLayerContainmentMergeSolverInput = {
121
- meshNodes: CapacityMeshNode[];
122
- simpleRouteJson: SimpleRouteJson;
123
- minFragmentArea?: number;
124
- };
125
- declare class AdjacentLayerContainmentMergeSolver extends BaseSolver {
126
- private input;
127
- private outputNodes;
128
- private promotedNodeIds;
129
- private residualNodeIds;
130
- constructor(input: AdjacentLayerContainmentMergeSolverInput);
131
- _setup(): void;
132
- _step(): void;
133
- private processAdjacentLayerContainmentMerges;
134
- getOutput(): {
135
- outputNodes: CapacityMeshNode[];
136
- };
137
- visualize(): GraphicsObject;
138
- }
139
-
140
- interface SegmentWithAdjacentEmptySpace {
141
- parent: CapacityMeshNode;
142
- start: {
143
- x: number;
144
- y: number;
145
- };
146
- end: {
147
- x: number;
148
- y: number;
149
- };
150
- z: number;
151
- facingDirection: "x+" | "x-" | "y+" | "y-";
152
- }
153
- /**
154
- * Find edges with adjacent empty space in the mesh
155
- *
156
- * Do this by iterating over each edge of the rect (each step is one edge)
157
- * and checking if the is completely covered by any other edge
158
- *
159
- * If it is completely covered, then it doesn't have an adjacent empty space,
160
- * continue
161
- *
162
- * If it is partially uncovered, then divide it into uncovered segments and add
163
- * each uncovered segment as a new edge with an adjacent empty space
164
- */
165
- declare class FindSegmentsWithAdjacentEmptySpaceSolver extends BaseSolver {
166
- private input;
167
- allEdges: Array<SegmentWithAdjacentEmptySpace>;
168
- unprocessedEdges: Array<SegmentWithAdjacentEmptySpace>;
169
- segmentsWithAdjacentEmptySpace: Array<SegmentWithAdjacentEmptySpace>;
170
- edgeSpatialIndex: Flatbush;
171
- lastCandidateEdge: SegmentWithAdjacentEmptySpace | null;
172
- lastOverlappingEdges: Array<SegmentWithAdjacentEmptySpace> | null;
173
- lastUncoveredSegments: Array<SegmentWithAdjacentEmptySpace> | null;
174
- constructor(input: {
175
- meshNodes: CapacityMeshNode[];
176
- });
177
- _step(): void;
178
- getOutput(): {
179
- segmentsWithAdjacentEmptySpace: Array<SegmentWithAdjacentEmptySpace>;
180
- };
181
- visualize(): Required<GraphicsObject>;
182
- }
183
-
184
- type ExpandEdgesToEmptySpaceSolverInput = {
185
- inputMeshNodes: CapacityMeshNode[];
186
- segmentsWithAdjacentEmptySpace: Array<SegmentWithAdjacentEmptySpace>;
187
- boardVoid?: {
188
- boardVoidRects: XYRect[];
189
- layerCount: number;
190
- };
191
- };
192
- interface ExpandedSegment {
193
- segment: SegmentWithAdjacentEmptySpace;
194
- newNode: CapacityMeshNode;
195
- }
196
- declare class ExpandEdgesToEmptySpaceSolver extends BaseSolver {
197
- private input;
198
- unprocessedSegments: Array<SegmentWithAdjacentEmptySpace>;
199
- expandedSegments: Array<ExpandedSegment>;
200
- lastSegment: SegmentWithAdjacentEmptySpace | null;
201
- lastSearchBounds: Bounds | null;
202
- lastCollidingNodes: CapacityMeshNode[] | null;
203
- lastSearchCorner1: {
204
- x: number;
205
- y: number;
206
- } | null;
207
- lastSearchCorner2: {
208
- x: number;
209
- y: number;
210
- } | null;
211
- lastExpandedSegment: ExpandedSegment | null;
212
- rectSpatialIndex: RBush<CapacityMeshNode>;
213
- constructor(input: ExpandEdgesToEmptySpaceSolverInput);
214
- _step(): void;
215
- getOutput(): {
216
- expandedSegments: ExpandedSegment[];
217
- };
218
- visualize(): Required<GraphicsObject>;
219
- }
220
-
221
- type GapFillSolverInput = {
222
- meshNodes: CapacityMeshNode[];
223
- boardVoid?: {
224
- boardVoidRects: XYRect[];
225
- layerCount: number;
226
- };
227
- };
228
- declare class GapFillSolverPipeline extends BasePipelineSolver<GapFillSolverInput> {
229
- findSegmentsWithAdjacentEmptySpaceSolver?: FindSegmentsWithAdjacentEmptySpaceSolver;
230
- expandEdgesToEmptySpaceSolver?: ExpandEdgesToEmptySpaceSolver;
231
- pipelineDef: PipelineStep<any>[];
232
- getOutput(): {
233
- outputNodes: CapacityMeshNode[];
234
- };
235
- initialVisualize(): GraphicsObject;
236
- finalVisualize(): GraphicsObject;
237
- }
238
-
239
- type OuterLayerContainmentMergeSolverInput = {
240
- meshNodes: CapacityMeshNode[];
241
- simpleRouteJson: SimpleRouteJson;
242
- zIndexByName: Map<string, number>;
243
- obstacleClearance?: number;
244
- };
245
- declare class OuterLayerContainmentMergeSolver extends BaseSolver {
246
- private input;
247
- private outputNodes;
248
- private promotedNodeIds;
249
- private residualNodeIds;
250
- constructor(input: OuterLayerContainmentMergeSolverInput);
251
- _setup(): void;
252
- _step(): void;
253
- private processOuterLayerContainmentMerges;
254
- private buildObstaclesByLayer;
255
- private isTransitCompatibleAcrossIntermediateLayers;
256
- getOutput(): {
257
- outputNodes: CapacityMeshNode[];
258
- };
259
- visualize(): GraphicsObject;
260
- }
261
-
262
- type RectDiffSeedingSolverInput = {
263
- simpleRouteJson: SimpleRouteJson;
264
- obstacleIndexByLayer: Array<RBush<RTreeRect>>;
265
- gridOptions?: Partial<GridFill3DOptions>;
266
- boardVoidRects?: XYRect[];
267
- layerNames: string[];
268
- zIndexByName: Map<string, number>;
269
- obstacleClearance?: number;
270
- };
271
- /**
272
- * First phase of RectDiff: grid-based seeding and placement.
273
- *
274
- * This solver is responsible for walking all grid sizes and producing
275
- * an initial set of placed rectangles.
276
- */
277
- declare class RectDiffSeedingSolver extends BaseSolver {
278
- private input;
279
- private srj;
280
- private layerNames;
281
- private layerCount;
282
- private bounds;
283
- private options;
284
- private boardVoidRects?;
285
- private gridIndex;
286
- private candidates;
287
- private placed;
288
- private placedIndexByLayer;
289
- private hardPlacedByLayer;
290
- private expansionIndex;
291
- private edgeAnalysisDone;
292
- private totalSeedsThisGrid;
293
- private consumedSeedsThisGrid;
294
- constructor(input: RectDiffSeedingSolverInput);
295
- _setup(): void;
296
- /** Exactly ONE grid candidate step per call. */
297
- _step(): void;
298
- /**
299
- * One micro-step during the GRID phase: handle exactly one candidate.
300
- */
301
- private _stepGrid;
302
- /** Compute solver progress (0 to 1) during GRID phase. */
303
- computeProgress(): number;
304
- /**
305
- * Output the intermediate RectDiff engine data to feed into the
306
- * expansion phase solver.
307
- */
308
- getOutput(): {
309
- layerNames: string[];
310
- layerCount: number;
311
- bounds: XYRect;
312
- options: Required<Omit<GridFill3DOptions, "gridSizes" | "maxMultiLayerSpan">> & {
313
- gridSizes: number[];
314
- maxMultiLayerSpan: number | undefined;
315
- };
316
- boardVoidRects: XYRect[] | undefined;
317
- gridIndex: number;
318
- candidates: Candidate3D[];
319
- placed: Placed3D[];
320
- expansionIndex: number;
321
- edgeAnalysisDone: boolean;
322
- totalSeedsThisGrid: number;
323
- consumedSeedsThisGrid: number;
324
- obstacles: Obstacle[];
325
- obstacleClearance: number | undefined;
326
- };
327
- /** Visualization focused on the grid seeding phase. */
328
- visualize(): GraphicsObject;
329
- }
330
-
331
- type RectDiffExpansionSolverInput = {
332
- layerNames: string[];
333
- layerCount: number;
334
- bounds: XYRect;
335
- options: {
336
- gridSizes: number[];
337
- [key: string]: any;
338
- };
339
- boardVoidRects: XYRect[];
340
- gridIndex: number;
341
- candidates: Candidate3D[];
342
- placed: Placed3D[];
343
- expansionIndex: number;
344
- edgeAnalysisDone: boolean;
345
- totalSeedsThisGrid: number;
346
- consumedSeedsThisGrid: number;
347
- obstacleIndexByLayer: Array<RBush<RTreeRect>>;
348
- zIndexByName: Map<string, number>;
349
- layerNamesCanonical: string[];
350
- obstacles: Obstacle[];
351
- obstacleClearance?: number;
352
- };
353
- /**
354
- * Second phase of RectDiff: expand placed rects to their maximal extents.
355
- *
356
- * This solver takes the intermediate data produced by RectDiffSeedingSolver
357
- * and runs the EXPANSION phase, then finalizes to capacity mesh nodes.
358
- */
359
- declare class RectDiffExpansionSolver extends BaseSolver {
360
- private input;
361
- placedIndexByLayer: Array<RBush<RTreeRect>>;
362
- _meshNodes: CapacityMeshNode[];
363
- constructor(input: RectDiffExpansionSolverInput);
364
- _setup(): void;
365
- _step(): void;
366
- private _stepExpansion;
367
- private finalizeIfNeeded;
368
- computeProgress(): number;
369
- getOutput(): {
370
- meshNodes: CapacityMeshNode[];
371
- };
372
- /** Simple visualization of expanded placements. */
373
- visualize(): GraphicsObject;
374
- }
375
-
376
- type RectDiffGridSolverPipelineInput = {
377
- bounds: Bounds;
378
- obstacles: Obstacle[];
379
- connections: SimpleRouteConnection[];
380
- outline?: Pick<SimpleRouteJson, "outline">;
381
- layerCount: number;
382
- minTraceWidth: number;
383
- obstacleClearance?: number;
384
- gridOptions?: Partial<GridFill3DOptions>;
385
- boardVoidRects?: XYRect[];
386
- layerNames?: string[];
387
- zIndexByName?: Map<string, number>;
388
- };
389
- declare class RectDiffGridSolverPipeline extends BasePipelineSolver<RectDiffGridSolverPipelineInput> {
390
- rectDiffSeedingSolver?: RectDiffSeedingSolver;
391
- rectDiffExpansionSolver?: RectDiffExpansionSolver;
392
- private obstacleIndexByLayer;
393
- private layerNames;
394
- private zIndexByName;
395
- constructor(inputProblem: RectDiffGridSolverPipelineInput);
396
- pipelineDef: PipelineStep<any>[];
397
- getConstructorParams(): RectDiffGridSolverPipelineInput[];
398
- getOutput(): {
399
- meshNodes: CapacityMeshNode[];
400
- };
401
- visualize(): GraphicsObject;
402
- }
403
-
404
- interface RectDiffPipelineInput {
405
- simpleRouteJson: SimpleRouteJson;
406
- gridOptions?: Partial<GridFill3DOptions>;
407
- obstacleClearance?: number;
408
- }
409
- declare class RectDiffPipeline extends BasePipelineSolver<RectDiffPipelineInput> {
410
- rectDiffGridSolverPipeline?: RectDiffGridSolverPipeline;
411
- gapFillSolver?: GapFillSolverPipeline;
412
- outerLayerContainmentMergeSolver?: OuterLayerContainmentMergeSolver;
413
- adjacentLayerContainmentMergeSolver?: AdjacentLayerContainmentMergeSolver;
414
- boardVoidRects: XYRect[] | undefined;
415
- zIndexByName?: Map<string, number>;
416
- layerNames?: string[];
417
- pipelineDef: PipelineStep<any>[];
418
- _setup(): void;
419
- getConstructorParams(): RectDiffPipelineInput[];
420
- getOutput(): {
421
- meshNodes: CapacityMeshNode[];
422
- };
423
- initialVisualize(): GraphicsObject;
424
- finalVisualize(): GraphicsObject;
425
- }
426
-
427
- export { RectDiffPipeline, type RectDiffPipelineInput };