@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.
- package/.github/workflows/bun-pver-release.yml +24 -45
- package/lib/RectDiffPipeline.ts +0 -46
- package/lib/fixtures/twoNodeExpansionFixture.ts +1 -1
- package/lib/solvers/GapFillSolver/ExpandEdgesToEmptySpaceSolver.ts +4 -2
- package/lib/solvers/GapFillSolver/FindSegmentsWithAdjacentEmptySpaceSolver.ts +3 -1
- package/lib/solvers/GapFillSolver/GapFillSolverPipeline.ts +6 -2
- package/lib/solvers/RectDiffExpansionSolver/RectDiffExpansionSolver.ts +5 -2
- package/lib/solvers/RectDiffGridSolverPipeline/RectDiffGridSolverPipeline.ts +8 -5
- package/lib/solvers/RectDiffGridSolverPipeline/buildObstacleIndexes.ts +6 -6
- package/lib/solvers/RectDiffSeedingSolver/RectDiffSeedingSolver.ts +4 -4
- package/lib/solvers/RectDiffSeedingSolver/computeCandidates3D.ts +1 -1
- package/lib/solvers/RectDiffSeedingSolver/computeEdgeCandidates3D.ts +1 -1
- package/lib/solvers/RectDiffSeedingSolver/longestFreeSpanAroundZ.ts +1 -1
- package/lib/types/capacity-mesh-types.ts +1 -1
- package/lib/types/srj-types.ts +0 -1
- package/lib/utils/expandRectFromSeed.ts +1 -1
- package/lib/utils/finalizeRects.ts +1 -1
- package/lib/utils/isFullyOccupiedAtPoint.ts +1 -1
- package/lib/utils/isSelfRect.ts +1 -1
- package/lib/utils/rectToTree.ts +2 -2
- package/lib/utils/renderObstacleClearance.ts +1 -1
- package/lib/utils/resizeSoftOverlaps.ts +1 -1
- package/lib/utils/sameTreeRect.ts +1 -1
- package/lib/utils/searchStrip.ts +1 -1
- package/package.json +12 -8
- package/pages/repro/merge-single-layer-node.page.tsx +17 -0
- package/tests/__snapshots__/board-outline.snap.svg +2 -2
- package/tests/solver/__snapshots__/rectDiffGridSolverPipeline.snap.svg +1 -1
- package/tests/solver/both-points-equivalent/__snapshots__/both-points-equivalent.snap.svg +1 -1
- package/tests/solver/bugreport01-be84eb/__snapshots__/bugreport01-be84eb.snap.svg +1 -1
- package/tests/solver/bugreport02-bc4361/__snapshots__/bugreport02-bc4361.snap.svg +1 -1
- package/tests/solver/bugreport03-fe4a17/__snapshots__/bugreport03-fe4a17.snap.svg +1 -1
- package/tests/solver/bugreport07-d3f3be/__snapshots__/bugreport07-d3f3be.snap.svg +1 -1
- package/tests/solver/bugreport08-e3ec95/__snapshots__/bugreport08-e3ec95.snap.svg +1 -1
- package/tests/solver/bugreport09-618e09/__snapshots__/bugreport09-618e09.snap.svg +1 -1
- package/tests/solver/bugreport10-71239a/__snapshots__/bugreport10-71239a.snap.svg +1 -1
- package/tests/solver/bugreport11-b2de3c/__snapshots__/bugreport11-b2de3c.snap.svg +1 -1
- package/tests/solver/bugreport12-35ce1c/__snapshots__/bugreport12-35ce1c.snap.svg +1 -1
- package/tests/solver/bugreport13-b9a758/__snapshots__/bugreport13-b9a758.snap.svg +1 -1
- package/tests/solver/bugreport16-d95f38/__snapshots__/bugreport16-d95f38.snap.svg +1 -1
- package/tests/solver/bugreport19/__snapshots__/bugreport19.snap.svg +1 -1
- package/tests/solver/bugreport20-obstacle-clipping/__snapshots__/bugreport20-obstacle-clipping.snap.svg +1 -1
- package/tests/solver/bugreport21-board-outline/__snapshots__/bugreport21-board-outline.snap.svg +2 -2
- package/tests/solver/bugreport22-2a75ce/__snapshots__/bugreport22-2a75ce.snap.svg +1 -1
- package/tests/solver/bugreport23-LGA15x4/__snapshots__/bugreport23-LGA15x4.snap.svg +1 -1
- package/tests/solver/bugreport24-05597c/__snapshots__/bugreport24-05597c.snap.svg +1 -1
- package/tests/solver/bugreport25-4b1d55/__snapshots__/bugreport25-4b1d55.snap.svg +1 -1
- package/tests/solver/bugreport36-bf8303/__snapshots__/bugreport36-bf8303.snap.svg +1 -1
- package/tests/solver/interaction/__snapshots__/interaction.snap.svg +1 -1
- package/tests/solver/multi-point/__snapshots__/multi-point.snap.svg +1 -1
- package/tests/solver/no-better-path/__snapshots__/no-better-path.snap.svg +1 -1
- package/tests/solver/repros/merge-single-layer-node/merge-single-layer-node.json +861 -0
- 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
- package/tests/solver/transitivity/__snapshots__/transitivity.snap.svg +2 -2
- package/tsconfig.json +5 -1
- package/vite.config.ts +4 -0
- package/dist/index.d.ts +0 -427
- package/dist/index.js +0 -3319
- package/lib/solvers/AdjacentLayerContainmentMergeSolver/AdjacentLayerContainmentMergeSolver.ts +0 -456
- package/lib/solvers/OuterLayerContainmentMergeSolver/OuterLayerContainmentMergeSolver.ts +0 -314
- package/pages/bugreports/bugreport50-multi-support-layer-merge.page.tsx +0 -19
- package/pages/pour.page.tsx +0 -18
- package/test-assets/bugreport49-634662.json +0 -412
- package/tests/outer-layer-containment-merge-solver.test.ts +0 -73
- package/tests/solver/bugreport49-634662/__snapshots__/bugreport49-634662.snap.svg +0 -44
- package/tests/solver/bugreport49-634662/bugreport49-634662.test.ts +0 -130
- package/tests/solver/bugreport50-multi-support-layer-merge/__snapshots__/bugreport50-multi-support-layer-merge.snap.svg +0 -44
- 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
|
|
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
|
-
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
const
|
|
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 (
|
|
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.
|
|
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 };
|